繼承反模式

不正確的繼承

可以說有兩個類 FooBarFoo 有兩個功能 Do1Do2Bar 需要使用來自 FooDo1,但它不需要 Do2 或者需要相當於 Do2 的功能但是做了完全不同的事情。

不好的方法 :在 Foo 虛擬上製作 Do2() 然後在 Bar 中覆蓋它,或者只在 Bar 中使用 throw ExceptionDo2()

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 繼承 FooBar 並分別實現 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 不可分割。當通過後面的例子來做 FooBar 時,commonalty 已被移動到 Baz 並且它們不會相互影響(就像不應該這樣)。