Conception de l'héritage à l'aide de la classe Interface + abstract. Bonnes pratiques?

Je ne suis pas vraiment sûr de savoir comment le titre de cette question, mais, fondamentalement, j'ai une interface comme ceci:

public interface IFoo
{
    string ToCMD();
}

un couple de absract classes qui implémentent IFoo comme:

public abstract class Foo : IFoo
{
   public abstract string ToCMD();
}

public abstract class Bar : IFoo
{
    public abstract string ToCMD();
}

puis les classes qui héritent de Foo et Bar:

public class FooClass1 : Foo
{
    public override string ToCMD()
    {return "Test";}
} ///there are about 10 foo classes.

public class BarClass : Bar
{
    public override string ToCMD()
    {return "BarClass";}
} ///about the same for bar classes.

Je fais cela, de sorte que lorsque j'ai ma liste personnalisée comme:

public class Store<T> : List<T>  where T : IFoo {}

Je peux restreindre les types qui vont dans il mais en ayant l'interface, il faudra tout type de IFoo.

Quelque chose comme:

Store<Foo> store = new Store<Foo>(); //Only Foo types will work.
store.Add(new FooClass1()); //Will compile.

Store<IFoo> store = new Store<IFoo>(); //All IFoo types will work.
store.Add(new FooClass1()); //Will compile.
store.Add(new BarClass()); //Will compile.

Ma question est: Est-ce un ok façon d'aller à ce sujet? ou est-il un meilleur moyen?

EDIT: l'Image->
Conception de l'héritage à l'aide de la classe Interface + abstract. Bonnes pratiques?

source d'informationauteur Nathan W