继承反模式
不正确的继承
可以说有两个类 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 并且它们不会相互影响(就像不应该这样)。