Java 深度嵌套继承-好的做法还是坏的做法?

Java 深度嵌套继承-好的做法还是坏的做法?,java,php,inheritance,oop,Java,Php,Inheritance,Oop,我正在制作一个PHP web应用程序。我有一种情况,我相信这会为嵌套继承创造一个好时机。无论如何,我的情况如下: public class RecurringWeeklyEvent extends RecurringEvent { } public class RecurringEvent extends Event { } 在我看来,这并不是一个糟糕的设计实践;然而,我无论如何都不是一个高级的面向对象程序员。话虽如此,在我冒险在我的应用程序中使用这类代码之前,我想知道这对于经验丰富/有资格

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

public class RecurringWeeklyEvent extends RecurringEvent { }

public class RecurringEvent extends Event { }
在我看来,这并不是一个糟糕的设计实践;然而,我无论如何都不是一个高级的面向对象程序员。话虽如此,在我冒险在我的应用程序中使用这类代码之前,我想知道这对于经验丰富/有资格的程序员来说是好是坏

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

谢谢


Steve

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

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


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

我可能会称之为嵌套继承。不管怎样,不要试图在这里发现问题。当你对嵌套继承感到不舒服时,就停止嵌套继承。

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

引用:

继承的定义就变成了“类之间的上下级关系,其中下级(子)与上级(父)具有相同的行为(责任)加上至少一个附加属性。”

因此,只要将行为添加到派生类中(即继承不是添加额外成员的工具),并且(最好)不改变基类的已定义行为,那么您所做的事情似乎很好

详尽阐述 达菲莫说的是对的。我想从我对大卫·韦斯特在书中所说的解释中添加我的2p

应尽可能避免重写方法。更改子类中方法的行为可能会导致实现者感到困惑


(我仍然在思考OOP和对象。)

我不会称之为嵌套继承,只是“深层继承树”

看看你的例子,我不会创建一个周安全事件。如果您添加更多的时间步长(然后您将创建类TwoWeeklyRecurringEventMonthlyRecurringEvent),则扩展是不灵活的,这会导致混乱,并最终导致大量专用类。为此,我将跳过继承和一种更为冷静的方法:

我上一次编写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);
  }
...
}

当然,你可以将工厂方法直接封装到循环事件类。

注释:这不是大多数人会考虑多重继承的问题。嗨,Matt,你能详细说明一下你的行为是什么意思吗?这是否意味着仅当类添加/重写了方法而不仅仅是其他成员时,才应该派生该类?“行为”是指方法。要么添加新方法,要么重写现有方法。@Jeffrey-Java中没有多重继承的语法。它不受支持。