【发布时间】:2010-10-14 09:31:36
【问题描述】:
这是我发现自己不时使用的东西,我只是想获得一些关于这种做法的优点的反馈。
假设我有一个基类:
abstract class RealBase {
protected RealBase(object arg) {
Arg = arg;
}
public object Arg { get; private set; }
public abstract void DoThatThingYouDo();
}
我经常创建第二个通用基类来处理从基类中的“object”类型到“T”类型的转换,如下所示:
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...”在 通用基础?好/坏主意?尴尬?
任何反馈或建议将不胜感激。
【问题讨论】:
标签: c# generics inheritance oop