2012-08-07 58 views
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; 
    } 

} 

那么首先:你是否以我声明这些类和接口的方式看到了一个坏习惯? 现在我的困惑是关于我在课堂上定义的那两个公共属性:我是否还需要在接口中定义它们? 另外如果我想添加一个枚举成员到这个类呢? 无论我添加到我的班级,我还应该将其添加到其界面?

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

回答

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 
     }; 
    } 
} 

公告创建方法是静态的,所以你不必创建它的一个实例只是为了得到它的一个实例。另外,Parent和Child类只能通过界面进行读取,但您可以从课程内部进行设置。这通常是保持属性不被后面覆盖的好习惯,但您不一定非得这样做。我还将这些类重命名为使用普通骆驼套装,即使是首字母缩写词,因为这是C#命名标准的一部分。

+0

感谢蒂姆,看起来像我们都住在同一个城市:) - – Bohn 2012-08-07 16:38:27

+0

我需要更多的工作在这方面。为什么在工厂方法中返回'IOwlRelation'而不是简单的'OwlRelation'?我并不是说这是错误的,只是我从来不会想到这一点。 – jp2code 2012-08-07 16:42:45

+1

主要好处是你的OwlRelation类可能有其他的实现细节不适用于这个接口。接口的存在是为了准确定义对于特定类而言重要和相关的内容。消费者不需要知道我们班上发生了什么,甚至是什么。他们需要知道的是,我们有属性可以获得父母和孩子。 – 2012-08-07 16:50:46

1

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

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

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

+1

好的感谢解释。那我在课堂上的那两个家长和孩子的属性怎么样?curretny他们是他们的类类型,而不是他们的接口类型,所以你认为定义他们的类型也是他们的接口类型也更好? – Bohn 2012-08-07 16:28:06

+1

哦,在你的回答中,你的意思是输入“IOWLRelation”? – Bohn 2012-08-07 16:29:08

+0

您也可以为这些(IOWLClass)创建一个接口,并将这些属性放在IOWLRelation的接口中,假设从IOWLRelation继承的其他类也将这些类型用于父级和子级。 – 2012-08-07 16:30:44

1

想想接口将如何被使用。如果调用者想要了解Parent或Child,那么你想在界面中公开它。如果它们只是实现细节,那么不要将它们包含在界面中。

关于这些东西并没有真正严格的规则,因为这完全取决于如何使用接口。

我会说在AddSubClass,如果您总是将参数投射到OWLClass,您可能想要考虑这是否对调用者有意义。他们会不会试图通过传递两个不同的实现IOWLClass?如果这样做,演员阵容会抛出异常。这可以接受吗?