深层嵌套继承 - 糟糕或良好的实践?

时间:2009-12-26 23:58:39

标签: java php inheritance oop

我正在制作PHP Web应用程序。我有一种情况,我相信将为嵌套继承创造一个美好时光。无论如何,这是我的情况:

public class RecurringWeeklyEvent extends RecurringEvent { }

public class RecurringEvent extends Event { }

在我看来,这不是一个糟糕的设计实践;但是,无论如何,我不是一个先进的面向对象程序员。话虽如此,在我冒昧地在我的应用程序中使用这种代码之前,我想知道这是来自更有经验/合格的程序员的好或坏做法。

注意:在使用错误的术语进行更正后,我将标题从多重继承更改为嵌套继承。

由于

史蒂夫

5 个答案:

答案 0 :(得分:4)

引用David West

  

继承的定义然后变成,“从属(子)与上级(父)具有相同行为(责任)的类之间的上级 - 从属关系加上至少一个额外的。”

所以你所做的似乎很好,只要你将行为添加到你的派生类(即继承不是添加额外成员的工具),并且(最好)不改变基类的定义行为。

精化

duffymo说的是正确的。我想从我对David West在他的书中所说的内容的解释中加上我的2p。

应尽可能避免使用覆盖方法。更改子类中方法的行为可能会导致实现者的混淆。

(我仍然围绕着OOP和对象思维。)

答案 1 :(得分:2)

最好的方法是使用RecurringEvent,每个对象都有关于它何时复发的信息,可能每n天(甚至几小时,几分钟)。

从这两行来看,我猜你正在制作日历?您可能希望为以非标准方式重复出现的事件(例如,一周中的第三个星期一,十月的第一个星期一等)创建不同的类(重复事件的子类)。

正如您所知,这不是多重继承,多重继承是指单个类具有多个直接父类。在这种情况下,RecurringWeeklyEvent扩展了RecurringEvent,它扩展了Event。有了多重继承,它将是RecurrungWeeklyEvent扩展RecurringEvent和Event(我不确定在php或java中执行此操作的语法)。

答案 2 :(得分:2)

多重继承实际上有点不同。多继承是您的类从多个接口/超类继承的地方。你所拥有的是一个常规的磨合级别的层次结构,我相信这是非常好的。我发现有时人们会因为创建过于复杂的对象层次结构而感到厌烦,所以请注意这一点。不过,你的设计看起来很可以接受。

答案 3 :(得分:1)

我不会把它称为嵌套继承,只是'深度继承树'。

查看您的示例,我不会创建 WeeklyRecurringEvent 。如果您添加更多时间步骤(然后您将创建类 TwoWeeklyRecurringEvent MonthlyRecurringEvent ),这对于扩展是不灵活的,这会让人感到困惑并最终导致很多专用类。为此我会跳过继承和更复杂的方法:

我上一次写PHP是不久前的,我只是用Java来表达这个想法,应该足以得到这个想法:


class RecurringEvent extends Event{
   RecurringStep step;

   RecurringEvent(RecurringStep step){
     this.step=step;
   }
}

enum RecurringStep{
  MONTHLY,WEEKLY,DAILY,YEARLY;
}

为了更容易在代码中创建重复事件,我可能还会提供工厂方法:


class RecurringEventFactory{
...
  static createDailyEvent(){
     return new RecurringEvent(DAILY);
  }
...
}

当然,您可以将工厂方法直接封装到RecurringEvent类。

答案 4 :(得分:0)

我可能会称它为嵌套继承。无论哪种方式都不要试图在这里找到问题。当你感觉不舒服时,你就停止嵌套继承。