我有6个类,它们都是文档类型。所有文档类型都具有相同的8个字段。有一个类只包含这8个字段。其余的类有更多的字段。其中一些类具有相同的字段(在8个字段旁边)。
示例:
类文档:字段1到8
类表单:字段1到8以及字段9和10
class WorkInstruction:字段1到8以及字段9和10
类过程:字段1到10和字段11
希望这能说明我的观点。
我的问题是,实现这个的最佳方法是什么?我应该创建一个或多个接口,还是应该使用抽象类?
日Thnx
答案 0 :(得分:2)
使Document成为Form等的基本类型,或者使表单具有额外的字段和对单独Document的引用(即使用组合而不是继承)。在这种情况下,听起来遗传很可能是最好的选择,但它实际上取决于你想用它做什么。您是否拥有适用于任何文档的代码,包括Form,WorkInstruction等?
编辑:例如,假设您有一个用户界面控件,可以显示任何文档的公共部分 - 即常见的8个字段。这将采用Document的一个实例。您可能希望能够直接向其传递Form或WorkInstruction - 在这种情况下,最好从Document派生。或者,在渲染Form或WorkInstruction时,您可以创建分别传入文档部分的控件实例。即它之间的区别(在C#中 - 您没有指定您感兴趣的语言):
class Form : Document { ... }
// Later on
Controls.Add(new DocumentDisplay(form));
和此:
class Form
{
private Document Document { get; set; }
// Other stuff
}
// Later on
Controls.Add (new DocumentDisplay(form.Document));
在不了解您的其他设计的情况下,很难推荐其中一个。我通常更喜欢构图而不是继承,但这感觉更像是一种自然的继承情况。
答案 1 :(得分:0)
旧学校的答案是创建一个包含共享字段和继承的类。
时髦的答案是创建一个有这些恶魔并将其作为成员的课程。
继承会在类之间创建更多的依赖关系,如果你每次都改变基础,这被认为是不好的做法。
在一个简单的例子中,它并没有真正发挥那么大的作用。但是,如果您开始向这些字段添加行为,则可以。
答案 2 :(得分:0)
提供明确答案的信息太少
如果这些对象共享的唯一内容是数据属性......我会使用类似的东西。
class Document
{
List<Field> m_Fields;
public void AddField(Field f) {... }
public void AddFields(Field[] f) {... }
}
class DocumentFactory()
{
public static Document GetDocument()
{
Document d = new Document();
d.AddFields(GetDocumentFields()); // private helper .. returns fields 1-8
return d;
}
public static Document GetForm()
{
Document d = new Document();
AddDocumentFields(d);
d.AddField(FIELD_9);
d.AddField(FIELD_10);
}
// and so on..
}
任何与文档类型无关的代码都会进入Document类 除此之外,你还有专门的/基于特定对象类型的行为,你需要增长一个继承类型层次结构(正如Jon所说的那样......它看起来像名字中的IS-A关系。)