【问题标题】:How do I override virtual method with parameter that inherits base method parameter?如何使用继承基本方法参数的参数覆盖虚拟方法?
【发布时间】:2013-05-23 13:27:54
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c# inheritance virtual-functions overriding


    【解决方案1】:

    基本上,你不能。我建议您将自定义代码放入 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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-21
      • 2017-09-08
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多