gpt4 book ai didi

java - 面向对象设计 : generic handling of sub classes that introduce new fields

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:58 25 4
gpt4 key购买 nike

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

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

让我们称这个类为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
}

有时我们需要使用SomethingElseSomethingDifferent。它们与 Something 有 90% 的相似之处,因为相同的数据和行为描述了它们,但是它们各自都有额外的字段需要由程序的其余部分使用:

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
}

我想想出一个合适的方法来以通用的 OO 方式处理 Something 对象族,因为我不想将我的应用程序的其余部分与具体的实现细节结合起来 (因为稍后我们可能需要添加SomethingWacky)。我不想直接处理子类,因为这会破坏多态性,并且可能需要向下转型/进行类型转换 - 糟糕。

我能想到的解决方法如下:

  1. 创建一个定义Something 系列的所有方法的抽象基类。然后, children 只实现他们关心的行为,为不关心的方法留下 NOP/空白覆盖。这使得一切都得到相同的对待,但引入了界面膨胀。
  2. 按照 Tell, Don't Ask,通过通用工作方法将责任转移到基类.例如,这可能是 display()、doWork()、persist()、getStateFromDisplay() 等。每个子类在覆盖这些基本方法时都会考虑其数据。我最近读了 Allen Holub 的一篇文章,建议这样的事情可能是一个很好的做法。这似乎将过多的外部问题责任转移给了类(class)。
  3. 创建某种数据类,将来自子类的所有额外数据/行为分组,并在 Something 中引用它。这感觉不太像 OO。

我在之前的项目中使用过方法 1 - 但在那种情况下,即使每个子类只实现/覆盖它关心的方法,操作实际上足够通用,所以一个类可以连贯地实现所有或只有一些。

每种方法在某种程度上都感觉很脏,我真的不喜欢任何一种。我有什么选择?也许我完全在滥用继承或完全以错误的方式接近它。我乐于接受任何建议,并希望利用 OO 技术提出更简洁、解耦的设计。我真的很想知道人们是如何解决此类问题的,如果您能向我推荐任何资源,我将不胜感激。

谢谢

最佳答案

当需要添加 SomethingElseSomethingDifferent 等突然出现时,我会问:Does SomethingElse 真的需要能够单独访问Something 的所有数据和行为元素?还是它对 Something 的使用仅限于几种方法?

如果是后者,通常最好封装其他类经常使用的Something的具体行为,然后use composition rather than inheritance .

关于java - 面向对象设计 : generic handling of sub classes that introduce new fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7004927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com