子类或不子类

时间:2010-12-30 19:33:33

标签: oop subclass

我有三个对象;行动,问题和风险。这些都包含一系列公共变量/属性(例如:描述,标题,截止日期,提升等)和一些特定字段(风险有概率)。问题是:

  1. 我应该创建3个单独的 每个行动作,风险和问题 包含重复字段。

  2. 创建父类“Abstract_Item” 包含这些字段和 对他们的操作然后有 行动,风险和问题子类 Abstract_Item。这会坚持 干校长。

7 个答案:

答案 0 :(得分:5)

我的观点

让我们说,如果你使用了继承。在一段时间内,您有新属性,这些属性仅对于操作问题而非风险是通用的。你将如何处理?如果你把它们放在父母之下,那么Risk就会继承那些无关紧要的东西(Liskov Substituon Principle knocking?)。如果你把它分别放在Action和Risk中,那么你就会破坏DRY,这是你开始继承的最初原因。点是Inhertence重复使用是坏事。如果没有“is-a”那么最好不要使用它,当你有疑问时,就没有真正的“是-a”。

我的偏好

还有其他实现DRY的方法,如下面的示例代码所示。通过添加新属性,我将成为另一个 Common2 ,如果它们不适用于所有3个类,则添加新行为是新的 CommonBehavior2 ;如果他们只是改变现有的 Common CommonBehavior

public class Common implements CommonBehavior
{
    String Description;
    String title;

    public void f() {}
}

public interface CommonBehavior
{
    void f();
}

public class Action implements CommonBehavior
{
    private Common delegate;

    public void f()
    {
        delegate.f();
    }
}

另请参阅另一个实际示例Design pattern to add a new class

对类似问题的回答

答案 1 :(得分:2)

是的,坚持DRY通常是一个非常好的主意除了如果这些类有非常非常不同的用途(即苹果和汽车都可能是红色的,我仍然不会得到它们两者来自名为ProbablyRed的基类。但是,在您的情况下,我肯定会选择基类,因为您描述的实现(ActionIssueRisk)似乎都是某种业务规则。类似的语义。

答案 2 :(得分:0)

你好像在回答这个问题。正如你所说,干。

答案 3 :(得分:0)

抽象的父类听起来像是要走的路。它还可以或更容易(取决于您的语言)实现和使用对三个项目中的任何一个起作用的功能。例如,您可以拥有“获取{user}所有项目的列表”功能。

答案 4 :(得分:0)

如果查看用例,可能会看到另一个方面,可能是处理属性的不同子组。

例如,如果“标签”,“截止日期”和“提升”用于类似应用程序,而“行动”和“风险”的其他属性在处理该任务时将很普遍,您可能会考虑聚合让我们说任务(标签,截止日期......)和主题,这是对动作,问题或其他任何事情的多态参考有一天会出现

答案 5 :(得分:0)

我想我在这里回答了同样的问题

When to create a class vs setting a boolean flag?

答案 6 :(得分:0)

不要仅仅因为对象共享某些数据或操作而进行子类化。将合成视为遵循DRY的默认方式。

在您的特定情况下,如果您的对象实际上是相关的,则只创建一个父类,即与父类有一个语义“是”关系。例如,如果Action,Issue和Risk都是Ticket对象。