如何使用继承基本方法参数的参数覆盖虚方法?

时间:2013-05-23 13:27:54

标签: c# inheritance virtual-method method-overriding

我有一组从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
    }
}

谢谢

1 个答案:

答案 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);
}

但目前尚不清楚这会增加很多价值。