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