Я ищу лучший способ осуществить следующую ситуацию (.NET 3.5):C# Override и Новый В то же самое время
interface IGetThing<T>
{
T Get();
}
class BaseGetter<A> : IGetThing<A> where A : new()
{
public virtual A Get()
{
return new A();
}
}
class DerivedGetter<B, A> : Base, IGetThing<B> where B : A, new() where A : new()
{
public override A Get()
{
return Get(); //B version
}
public new virtual B Get()
{
return new B();
}
}
Я оцениваемые сообщения как This one, но я не могу увидеть решение что это будет эквивалентно.
Я видел предложения, которые я использую явную реализацию интерфейса, чтобы сделать что-то подобное, но я не понимаю, как это решает проблему наследования:
Если Get() была реализовано в явном виде в обоих местах, это Wouldn Решить проблему: ((IGetThing<A>)new DerivedGetter<B, A>()).Get()
, вызывая базовый метод, а не нужный производный метод.
Попытка реализовать как IGetThing, так и IGetThing в DerivedGetter вызывает исключение для компиляции. («DerivedGetter» не может реализовать как «IGetThing» и «IGetThing», потому что они могут объединиться для некоторых замен параметров типа)
Кроме того, попытки повторной реализации явной реализации BaseGetter в (IGetThing<A>.Get()
) в DerivedGetter также обеспечивает исключение компиляции (The очевидный 'DerivedGetter.IGetThing < ...>. Get()': содержащий тип не реализует интерфейс 'IGetThing')
Целью является скрыть и переопределить базу Get() при использовании Derived.
У кого-нибудь есть идеи?
РЕДАКТИРОВАТЬ: Общее решение предпочтительно иметь возможность масштабировать до нескольких слоев производных классов.
Как в стороне, это только начало давать мне проблемы с компиляцией при изменении с .NET 4 на .NET 3.5.
На самом деле это не работает, если вы накладываете на '' IGetThing , вы получите стек переполнение, потому что BaseGetter 'Get()' в конечном итоге вызывает себя. – jdphenix
Исправлено для этого случая. – jdphenix
Жизнеспособное решение, приведенное выше, но не похоже, что оно будет масштабироваться для третьего (или более) уровня вывода. Например. Derived2Getter, где C: B, отбрасывание на DerivedGetter , попытка сделать Get(), чтобы вернуть тип C в виде бокса, как B. –
Serge