面向对象设计:引入新字段的子类的通用处理

fil*_*fku 6 java language-agnostic oop

这是我一直遇到的设计问题,所以我想我最终会把它放在那里,看看人们会如何接近它.问题如下:

我确定了一个特定的类,它在很大程度上描述了我将使用的所有对象实例,包括行为和数据.这很棒,适用于基本对象.然后会出现一些其他类型的对象需要相同的数据和行为,但另外还希望在这里和那里有一个额外的字段,或者额外的数据结构.

让我们称之为Something:

public class Something {
    private int id;
    private String fieldA;
    private String fieldB;
    private List<Data> list;

    // Then we have getters, setters, and some base methods
}
Run Code Online (Sandbox Code Playgroud)

有时我们需要使用SomethingElseSomethingDifferent.他们90%喜欢Something,因为相同的数据和行为描述了它们,但是它们每个还有额外的字段需要由程序的其余部分使用:

public class SomethingElse extends Something {
    private String dataSpecificToSomethingElse;
    // Then we have getters, setters, and some new-data specific methods
}

public class SomethingDifferentextends Something {
    private List<DifferentData> dataSpecificToSomethingDifferent;
    // Then we have getters, setters, and some new-data specific methods
}
Run Code Online (Sandbox Code Playgroud)

我想以一种通用的OO方式提出一种处理Something系列对象的好方法,因为我不想将我的应用程序的其余部分与具体的实现细节结合起来(因为我们可能需要稍后添加SomethingWacky) .我不想直接处理子类,因为它打破了多态性,并且可能包括需要向下转换/做一个类型切换 - 哎呀.

我能想到解决这个问题的方法如下:

  1. 创建一个抽象基类,定义Something系列的所有方法.然后,儿童只实施他们所关心的行为,为不受关注的方法留下NOP /空白覆盖.这使得所有内容都可以被处理,但会引入界面膨胀.
  2. Tell,Do not Ask之后,通过通用工作方法将责任移到基类.例如,这可能是诸如display(),doWork(),persist(),getStateFromDisplay()等等.每个子类在覆盖这些基本方法时会考虑其数据.我最近读了Allen Holub的一篇文章,建议这样的事情可能是一个好习惯.对于课堂上的外部问题,这似乎正在变得太过分.
  3. 创建某种数据类,将来自子类的所有额外数据/行为分组,并在Something中引用它.这感觉不像OO.

我在前一个项目中使用过1 - 但是在那个例子中,即使每个子类只实现/覆盖它关心的方法,操作实际上也足够通用,因此一个类可以连贯地实现全部或仅一些.

每种方法在某种程度上都很脏,我真的不喜欢任何方法.我有什么选择?也许我完全滥用继承或完全以错误的方式接近这一点.我愿意接受任何建议,并希望利用面向对象技术来提出更清晰,分离的设计.我真的很想知道人们如何解决这样的问题,你可以引用我的任何资源都会非常感激.

谢谢

oks*_*ayt 3

当需要添加SomethingElseSomethingDifferent等时,我会问:SomethingElse真的需要能够单独访问 的所有数据和行为元素吗Something?或者它的使用Something仅限于几种方法?

如果是后者,通常最好封装Something其他类经常使用的特定行为,然后使用组合而不是继承