Вот кое-что, что я использую время от времени, и я просто хотел получить некоторые отзывы о достоинствах практики.
Допустим, у меня есть базовый класс:
abstract class RealBase {
protected RealBase(object arg) {
Arg = arg;
}
public object Arg { get; private set; }
public abstract void DoThatThingYouDo();
}
Я часто создаю второй базовый класс, который является универсальным, который обрабатывает приведение типа «объект» в базовом классе к типу «Т», например:
abstract class GenericBase<T> : RealBase {
protected GenericBase(T arg)
: base( arg ) {
}
new public T Arg { get { return (T) base.Arg; } }
}
Это позволяет мне получить доступ к «Arg» как к его явному типу без операции приведения:
class Concrete : GenericBase<string> {
public Concrete( string arg )
: base( arg ) {
}
public override void DoThatThingYouDo() {
// NOTE: Arg is type string. No cast necessary.
char[] chars = Arg.ToLowerInvariant().ToCharArray();
// Blah( blah, blah );
// [...]
}
}
Все время имея возможность работать с ним через "RealBase":
class Usage {
public void UseIt() {
RealBase rb = new Concrete( "The String Arg" );
DoTheThing(rb);
}
private void DoTheThing(RealBase thingDoer) {
rb.DoThatThingYouDo();
}
}
Предполагается, что есть много других "Конкретных" типов ... не только один.
Вот мои вопросы / проблемы:
- Я "сошел с ума" за использование
такой подход?
- Есть ли
любые очевидные недостатки / предостережения
используя этот подход?
- Как насчет
что "новый публичный T ..." в
GenericBase? Хорошая / плохая идея? Неудобно?
Любые отзывы или советы будут с благодарностью.