Я думаю, что вы смешиваете здесь проблемы, и на самом деле виноват C # (и Java до этого).
Наследование должно служить механизмом категоризации, тогда как оно часто используется для повторного использования кода.
Для повторного использования кода всегда было известно, что композиция превосходит наследование.Проблема с C # заключается в том, что он дает нам такой простой способ наследования:
class MyClass : MyReusedClass { }
Но для того, чтобы сочинять, нам нужно сделать это самостоятельно:
class MyClass {
MyReusedClass _reused;
// need to expose all the methods from MyReusedClass and delegate to _reused
}
Чего не хватаетэто конструкция, похожая на черту (pdf) , которая приведет композицию к тому же уровню юзабилити, что и наследование.
В C # есть исследование черт (pdf) ,и это будет выглядеть примерно так:
class MyClass {
uses { MyTrait; }
}
Хотя я хотел бы увидеть другую модель (модель Perl 6).
ОБНОВЛЕНИЕ:
В качестве примечания к языку Oxygene имеется функция , которая позволяет делегировать все элементы интерфейса в свойство члена, реализующее этот интерфейс:
type
MyClass = class(IReusable)
private
property Reused : IReusable := new MyReusedClass(); readonly;
implements public IReusable;
end;
Здесь все члены интерфейса IReusable
будут доступны через MyClass
, и все они будут делегированы свойству Reused
.Однако с этим подходом есть проблем .
ДРУГОЕ ОБНОВЛЕНИЕ:
Я начал реализовывать эту концепцию автоматической композиции в C #: takeвзгляд на NRoles .