1

我的第一次基于界面的编程时间以及如何设计界面的一些困惑。

我为两个节点之间的关系创建了一个接口,如下所示:

public interface IOWLRelation
{
    IOWLRelation AddSubClass(IOWLClass parent, IOWLClass child);
}

然后我创建了实现这个接口的类,如下所示:

class OWLRelation: IOWLRelation
{
    public OWLClass Parent { get; set; }
    public OWLClass Child { get; set; }

    public IOWLRelation AddSubClass(IOWLClass parent, IOWLClass child)
    {
        this.Parent = (OWLClass) parent;
        this.Child = (OWLClass) child;
        return this;
    }

}

首先,你认为我声明这些类和接口的方式有什么不好的做法吗?现在我的困惑是关于我在我的类中定义的这两个公共属性:我是否还需要在接口中定义它们?另外,如果我想在这个类中添加一个枚举成员怎么办?无论我添加到我的课程中,我都应该将它添加到它的界面中吗?

更重要的是在方法实现中,我将接口传递给该方法的参数,它是坏的还是正确的?我应该通过接口还是应该通过他们的真实课程?

4

3 回答 3

1

如果从 IOWLRelation 继承的其他类也需要父/子,那么还要在接口中定义这些属性(在这种情况下,可能会将接口重命名为更通用的名称)。

在界面中,您应该定义您希望继承的类拥有的所有属性/方法(至少)。

通过接口完全没有问题。实际上它可能比实际的类更好,因为接口更通用。

于 2012-08-07T16:23:06.760 回答
1

在这种情况下,我会稍微不同地执行您的实现。如果您仔细考虑某人使用您的界面的工作流程,那会有点混乱。您必须首先创建一个 OWLRelation 对象,然后调用 AddSubClass 方法,该方法只返回您已经创建的对象。我会改用工厂方法:

public interface IOwlRelation
{
    OwlClass Parent { get; }
    OwlClass Child { get; }
}

public class OwlRelation : IOwlRelation
{
    public OwlClass Parent { get; private set; }
    public OwlClass Child { get; private set; }

    public static IOwlRelation Create(OwlClass parent, OwlClass child)
    {
        return new OwlRelation
        {
            Parent = parent,
            Child = child
        };
    }
}

请注意 Create 方法是静态的,因此您不必为了获取它的实例而创建它的实例。此外,Parent 和 Child 类通过接口是只读的,但您可以从类内部设置它们。这通常是防止属性在以后被覆盖的好习惯,但您不一定必须这样做。我还将这些类重命名为使用普通的驼峰式大小写,即使是首字母缩略词,因为这是 C# 命名标准的一部分。

于 2012-08-07T16:32:26.007 回答
1

根据如何使用接口来考虑接口。如果调用者想知道 Parent 或 Child,那么你想在接口中公开它。如果它们只是实现细节,那么不要将它们包含在接口中。

关于这些事情并没有真正严格的规则,因为这完全取决于接口的使用方式。

我想说的是AddSubClass,如果您总是将参数转换为 an OWLClass,您可能需要考虑这对调用者是否有意义。他们会尝试通过传递两个不同的实现来调用它IOWLClass吗?如果他们这样做,演员将抛出异常。这可以接受吗?

于 2012-08-07T16:34:15.267 回答