繼承反模式
不正確的繼承
可以說有兩個類 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 並且它們不會相互影響(就像不應該這樣)。