我有一组从ObjBase
类继承的对象。处理逻辑对于所有这些对象都是相同的,但有一些差异。如何将所有逻辑保留在public virtual void Work(ObjBase o)
中并在重写方法中处理特定逻辑。
以下示例是我想要实现的,但由于覆盖参数而无法编译。
实施该方法的更好方法是什么?
class Foo
{
public void Do(ObjBase o)
{
switch (o.RequestType)
{
case "A":
new ProcA<ObjA>().Work(o);
break;
case "B":
new ProcB<ObjB>().Work(o);
break;
}
}
}
class ObjBase { }
class ObjA : ObjBase { }
class ObjB : ObjBase { }
class ProcBase
{
public virtual void Work(ObjBase o)
{
//Common things to do...
}
}
class ProcA<T> : ProcBase where T : ObjBase
{
public override void Work(ObjA o)
{
base.Work(o);
//DoSpecificWork
}
}
class ProcB<T> : ProcBase where T : ObjBase
{
public override void Work(ObjB o)
{
base.Work(o);
//DoSpecificWork
}
}
谢谢
答案 0 :(得分:2)
基本上,你不能。我建议您将自定义代码放在virtual
方法中(例如也添加override
)和强制转换 - 例如:
public override void Work(ObjBase o)
{
base.Work(o);
var a = o as ObjA;
if (a != null)
{
// do a-specific things
}
}
这确保即使他们调用基类型的方法也会发生逻辑。
您还可以提供新的重载,例如:
public void Work(ObjA o)
{
Work((ObjBase)o);
}
但目前尚不清楚这会增加很多价值。