我已经看过很多例子来说明多重继承的危险性.
该示例通常类似于B类,C扩展A类,D类扩展B和C.
B和C都覆盖了A的方法,例如equals();
然后调用D.equals(); 它不知道应该调用其父项中的哪一个
前提是在D中不覆盖equals()
从我所看到的,这个例子中的A类不是多余的吗?如果我们从这个层次结构中删除A并且只看B和C,如果B和C都有名为equals()的方法,那么当D扩展B和C时,它仍然会有同样的问题,所以它不是真的死亡三角?
我不确定我所假设的是否会导致其他语言的编译时错误.
希望有人能为我澄清一下.
当我们的对象层次结构纯粹是语义的继承而不是行为的继承时,那么我们不可避免地需要在任何地方编写"instanceof"或"if/else"来进行运行时类型检查.
例如
如果我有一个对象层次结构
Class Function
Class Average extends Function
Class Sum extends Function
Class Max extends Function
Run Code Online (Sandbox Code Playgroud)
如果在这些类中有一个名为calculate()的方法,那么我们没有问题,我们可以利用多态性,这种设计满足LSP.
但是,如果由于某种原因我们不想将此calculate()方法添加到此层次结构中,则这些对象纯粹是对象无状态对象,只表示语义.
然后我们被迫在任何地方编写以下代码:
if (function instanceof Average)
//perform average
else if(function instanceof Sum)
//perform sum
else if(function instanceof Max)
//perform max
Run Code Online (Sandbox Code Playgroud)
上面的代码表明设计不好,因为你在任何地方编写这个代码,这个设计很脆弱,以后很难改变.我想如果数字函数是有限的并且函数的计算在一个地方,这可能是好的取决于复杂性.
到目前为止我所知道的是,要解决上述方法,唯一可行的方法是实现访问者模式,除了使用访问者模式之外,还有其他方法可以解决上述设计吗?
我可以从访问者模式看到的一个问题是访问者模式的accept方法没有返回值,如果accept()方法不能完全满足需求,这有时候不方便.
java design-patterns liskov-substitution-principle instanceof visitor-pattern