Je pense que vous mélangez les préoccupations ici, et que le C# est à blâmer, en fait (et Java avant lui).
L'héritage devrait servir de mécanisme de catégorisation, alors qu'il est souvent utilisé pour la réutilisation du code.
Pour la réutilisation du code, on a toujours su que la composition était supérieure à l'héritage. Le problème avec C# est qu'il nous donne un moyen si facile d'hériter :
class MyClass : MyReusedClass { }
Mais pour composer, nous devons le faire par nous-mêmes :
class MyClass {
MyReusedClass _reused;
// need to expose all the methods from MyReusedClass and delegate to _reused
}
Ce qui manque, c'est une construction comme un trait (pdf) qui amènera la composition au même niveau de convivialité que l'héritage.
Il y a des recherches sur Les traits en C# (pdf) et ça ressemblerait à quelque chose comme ça :
class MyClass {
uses { MyTrait; }
}
Bien que j'aimerais voir un autre modèle (celle des rôles de Perl 6).
UPDATE :
A titre d'information, le langage Oxygene a un élément qui vous permet de déléguer tous les membres d'une interface à une propriété membre qui implémente cette interface :
type
MyClass = class(IReusable)
private
property Reused : IReusable := new MyReusedClass(); readonly;
implements public IReusable;
end;
Ici, tous les membres de l'interface de IReusable
seront exposés par MyClass
et elles seront toutes déléguées à la Reused
la propriété. Il existe des problèmes avec cette approche, cependant.
UNE AUTRE MISE À JOUR :
J'ai commencé à mettre en œuvre ce concept de composition automatique en C# : jetez un coup d'œil à NRoles .