我正在制作PHP Web应用程序。我有一种情况,我相信将为嵌套继承创造一个美好时光。无论如何,这是我的情况:
public class RecurringWeeklyEvent extends RecurringEvent { }
public class RecurringEvent extends Event { }
在我看来,这不是一个糟糕的设计实践;但是,无论如何,我不是一个先进的面向对象程序员。话虽如此,在我冒昧地在我的应用程序中使用这种代码之前,我想知道这是来自更有经验/合格的程序员的好或坏做法。
注意:在使用错误的术语进行更正后,我将标题从多重继承更改为嵌套继承。
由于
史蒂夫
答案 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)
我可能会称它为嵌套继承。无论哪种方式都不要试图在这里找到问题。当你感觉不舒服时,你就停止嵌套继承。