继承反模式

不正确的继承

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