Буду признателен за любые советы о том, как действовать в следующем сценарии. Давайте посмотрим, смогу ли я объяснить это ясно (английский не является моим родным языком, поэтому все может запутаться, извините).
Предположим, у меня есть следующие интерфейсы:
internal interface IBlah
{
int Frob();
}
internal interface IBlahOnSteroids: IBlah
{
double Duh();
}
Теперь у нас есть класс Foo с отношением «имеет» с объектом IBlah:
public class Foo
{
IBlah blah;
internal Foo(IBlah blah)
{
this.blah = blah;
}
public int Frob()
{
....
return this.blah.Frob();
}
}
Теперь нам также нужен класс FooOnSteroids, который имеет отношение «имеет» с объектом IBlahOnSteroids.
Вопрос в том, что зная, что часть IBlahOnSteroids уже реализована в Foo, что произойдет, если мы создадим
FooOnSteroids наследуется от Foo?
Мы бы получили что-то вроде этого:
public class FooOnSteroids: Foo
{
IBlahOnSteroids blah;
internal FooOnSteroids(IBlahOnSteroids blah)
:base(blah)
{
this.blah = blah;
}
public double Duh()
{
return this.blah.Duh();
}
}
Это рекомендуемый шаблон? Мы передаем по цепочке наследования один и тот же объект «бла» и на каждом «уровне» мы храним его в частном
поле с «полезным» типом. Я не вижу, чтобы я мог хранить в BlahBase защищенное свойство, которое
раскрыл одну общую ссылку IBlah на все нисходящие классы, поскольку она должна иметь тип IBlah, который не будет полезен BlahOnSteroids. Этот сценарий даже
рекомендуемые? Или мы должны просто реализовать Foo и FooOnSteroids как независимые классы без наследования (это приведет к дублированию кода)? Может быть, это абсолютно нормально, но это похоже на взлом. Это 1014 *
Возможность использования непатентованных средств, которые могли бы решить проблему в кратчайшие сроки, невозможна, поскольку, да, я знаю, что это отстой, эта библиотека должна предназначаться для платформ .Net 1.x.
Возможность простой реализации BlahOnSteroids также возможна, но это будет означать, что в зависимости от вызывающей стороны, мы должны были бы выдать исключение, если любой из
Участники IBlahOnSteroids был вызван. Мне это не нравится.
Большое спасибо за любые советы!