继承反模式
不正确的继承
可以说有两个类 Foo
和 Bar
。Foo
有两个功能 Do1
和 Do2
。Bar
需要使用来自 Foo
的 Do1
,但它不需要 Do2
或者需要相当于 Do2
的功能但是做了完全不同的事情。
不好的方法 :在 Foo
虚拟上制作 Do2()
然后在 Bar
中覆盖它,或者只在 Bar
中使用 throw Exception
为 Do2()
public class Bar : Foo
{
public override void Do2()
{
//Does something completely different that you would expect Foo to do
//or simply throws new Exception
}
}
好办法
从 Foo
取出 Do1()
并将其放入新的 Baz
然后从 Baz
继承 Foo
和 Bar
并分别实现 Do2()
public class Baz
{
public void Do1()
{
// magic
}
}
public class Foo : Baz
{
public void Do2()
{
// foo way
}
}
public class Bar : Baz
{
public void Do2()
{
// bar way or not have Do2 at all
}
}
现在为什么第一个例子是坏的,第二个是好的:当开发者 nr2 必须在 Foo
中进行更改时,他很可能会破坏 Bar
的实现,因为 Bar
现在与 Foo
不可分割。当通过后面的例子来做 Foo
和 Bar
时,commonalty 已被移动到 Baz
并且它们不会相互影响(就像不应该这样)。