Class 如何实现使用相同变量的类

Class 如何实现使用相同变量的类,class,field,Class,Field,我有6个类,都是文档类型。所有文档类型都有相同的8个字段。有一个类只包含这8个字段。其余的类有更多的字段。其中一些类具有相同的字段(除了8个字段之外) 例如: 类文档:字段1到8 班级形式:第1至8栏、第9和第10栏 类工作说明:字段1到8以及字段9和10 分类程序:字段1至10和字段11 希望这能说明我的观点 我的问题是,实现这一点的最佳方式是什么?我应该创建一个或多个接口,还是应该使用抽象类 Thnx使文档成为表单等的基本类型,或使表单具有额外字段和对单独文档的引用(即使用组合而不是继承)。

我有6个类,都是文档类型。所有文档类型都有相同的8个字段。有一个类只包含这8个字段。其余的类有更多的字段。其中一些类具有相同的字段(除了8个字段之外)

例如:

类文档:字段1到8

班级形式:第1至8栏、第9和第10栏

类工作说明:字段1到8以及字段9和10

分类程序:字段1至10和字段11

希望这能说明我的观点

我的问题是,实现这一点的最佳方式是什么?我应该创建一个或多个接口,还是应该使用抽象类


Thnx

使文档成为表单等的基本类型,或使表单具有额外字段和对单独文档的引用(即使用组合而不是继承)。在这种情况下,听起来继承很可能是最好的选择,但这实际上取决于您想用它做什么。您是否有用于任何文档(包括表单、工作说明等)的代码

编辑:例如,假设您有一个用户界面控件,可以显示任何文档的公共部分,即公共8字段。这将以文档为例。您可能希望能够直接将表单或工作指令传递给它—在这种情况下,最好从文档派生。或者,在呈现窗体或工作指令时,可以创建单独传入文档部分的控件实例。i、 e.这是两者之间的区别(在C#-您没有指定您感兴趣的语言):

这是:

class Form
{
    private Document Document { get; set; }
    // Other stuff
}

// Later on
Controls.Add (new DocumentDisplay(form.Document));

在不了解其他设计的情况下,很难推荐其中一种。我通常更喜欢组合而不是继承,但这感觉更像是一种自然的继承情况。

老派的答案是创建一个包含共享字段和继承的类

流行的答案是创建一个拥有这些恶魔的类,并将其作为成员

继承会在类之间创建更多的依赖关系,如果您每次都更改基,这被认为是不好的做法


在一个简单的例子中,这并没有多大区别。但如果你开始在这些字段中添加行为,可能会出现这种情况。

信息太少,无法给出明确的答案

如果这些对象共享的唯一内容是数据属性。。。我会用这样的东西

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..
}
类文档
{
列出m_字段;
public void AddField(字段f){…}
public void AddFields(字段[]f){…}
}
类DocumentFactory()
{
公共静态文档GetDocument()
{
文件d=新文件();
d、 AddFields(GetDocumentFields());//private helper..返回字段1-8
返回d;
}
公共静态文档GetForm()
{
文件d=新文件();
添加文档字段(d);
d、 AddField(字段9);
d、 添加字段(字段10);
}
//等等。。
}
无论文档类型如何,任何有效的代码都会进入文档类。

除此之外,如果您的行为是专门化的/基于特定对象类型的,那么您需要增加继承类型层次结构(正如Jon所说……从名称上看,它看起来像是一种is-a关系。)

在您的描述中,“t/m”是什么意思?对不起,这是荷兰语,但我的意思是直到并包括在内。我已经编辑了我的文本,thnx:)是的,我的代码对于任何文档、getter和setter都是相同的。现在的目的是只读的,这不是实现代码是否相同的问题。问题是你是否有可以使用任何文档类型的代码。我不知道最后一部分。yo9u所说的“能够使用任何文档类型”是什么意思?您是否拥有适用于任何类型文档的功能,例如打印(obAnyTypeOfDocument),无论它是否是表单、工作指令、过程等,都应该可以工作。@Gishu:是的,对象的目的是打印数据
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..
}