0

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

谢谢

4

1 回答 1

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

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

于 2013-05-23T13:32:37.193 回答