C# 如何使用继承基本方法参数的参数重写虚拟方法?

C# 如何使用继承基本方法参数的参数重写虚拟方法?,c#,inheritance,virtual-functions,overriding,C#,Inheritance,Virtual Functions,Overriding,我从ObjBase类继承了一组对象。所有这些对象的处理逻辑都是相同的,只是有点不同。如何将所有逻辑保存在公共虚拟无效工作(ObjBase o)中,并将特定于流程的逻辑保存在重写方法中 下面的示例是我想要实现的,但由于重写参数,它无法编译 有什么更好的方法来实现这一点 class Foo { public void Do(ObjBase o) { switch (o.RequestType) { case "A":

我从
ObjBase
类继承了一组对象。所有这些对象的处理逻辑都是相同的,只是有点不同。如何将所有逻辑保存在
公共虚拟无效工作(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
    }
}
class-Foo
{
公共无效Do(ObjBase o)
{
开关(o.RequestType)
{ 
案例“A”:
新程序()工作(o);
打破
案例“B”:
新程序()工作(o);
打破
}
}
}
类ObjBase{}
类ObjA:ObjBase{}
类ObjB:ObjBase{}
类ProcBase
{
公共虚拟无效工作(ObjBase o)
{
//常见的事情。。。
}
}
类ProcA:ProcBase,其中T:ObjBase
{
公共覆盖无效工作(ObjA o)
{
基础工作(o);
//特定剂量工作
}
}
类ProcB:ProcBase,其中T:ObjBase
{
公共覆盖无效工作(OBO)
{
基础工作(o);
//特定剂量工作
}
}

谢谢

基本上,你不能。我建议您将自定义代码放入
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);
}
这确保了即使调用基类型的方法,逻辑也会发生

您还可以提供新的重载,例如:

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);
}
但尚不清楚这是否增加了很多价值