C# Language Héritage Anti-patrons


Exemple

Héritage incorrect

Disons qu'il y a 2 classes classe Foo et Bar . Foo a deux fonctionnalités Do1 et Do2 . Bar doit utiliser Do1 de Foo , mais elle ne nécessite pas Do2 ou nécessite une fonctionnalité équivalente à Do2 mais qui fait quelque chose de complètement différent.

Mauvaise manière : rendre Do2() sur Foo virtual, puis le remplacer dans Bar ou simplement throw Exception dans Bar pour 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 
    }
}

Bonne façon

Sortez Do1() de Foo et mettez-le dans la nouvelle classe Baz puis héritez de Foo et Bar de Baz et implémentez Do2() séparément

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
    }
}

Maintenant, pourquoi le premier exemple est mauvais et le second bon: quand le développeur nr2 doit faire un changement dans Foo , il est probable qu’il va casser l’implémentation de Bar parce que Bar est désormais indissociable de Foo . Par exemple, Foo and Bar commonalty a été déplacé dans Baz et ils ne s’affectent pas (comme dans le cas contraire).