C#覆盖不同的参数?

时间:2014-12-18 12:56:40

标签: c# .net override

以下是我要做的一个例子。

public class A
{
    public virtual void DoSomething(string a)
    {
      // perform something
    }
}
public class B : A
{
    public Override void DoSomething(string a, string b)
    {
      // perform something slightly different using both strings
    }
}

所以我想从A类中覆盖DoSomething并允许它传递第二个参数。这可能吗?

5 个答案:

答案 0 :(得分:10)

当覆盖virtual方法时,您必须保留原始"合同"方法,在您的情况下是string a变量。

为了做你想做的事,你可以创建一个带有两个字符串的虚拟重载

public class A
{
    public virtual void DoSomething(string a)
    {
      // perform something
    }
    public virtual void DoSomething(string a, string b)
    {
      // perform something
    }
}

public class B : A
{
    public override void DoSomething(string a, string b)
    {
      // perform something slightly different using both strings
    }
}

如果你想要的是接受方法中的N个字符串,可以使用params关键字:

public class A
{
    public virtual void DoSomething(params string[] allStrings)
    {
      // Do something with the first string in the array
      // perform something
    }
}

答案 1 :(得分:0)

不,这不会奏效。覆盖方法时需要具有相同的原型。

答案 2 :(得分:0)

不,这会超载。由于逻辑将略有不同'听起来你还需要两种不同的方法吗?您可以将类似的逻辑放在第三种方法中,并从DoSomething(string A)DoSomething(string A, string B)

中调用它

答案 3 :(得分:0)

轻微坏死,但是当您重载时,可以从新方法中调用原始方法。

如此

public class B : A {

    public virtual void DoSomething (string a, string b) {
        base.DoSomething(_a);
        //Do B things here
    }
}

这允许您修改方法而不是完全重做:)

答案 4 :(得分:0)

有一种方法。它需要一些代码。您创建一个大师级的fex。 “机器参数”。然后创建子类,例如“ MachineParamsGeneral”,“ MachineParamsDetail”。

您的功能现在类似于:

public override void Setup(MachineParams p)
{
// since you know what subclass this is inside, you can simple cast
MachineParamsGeneral g = (MachineParamsGeneral)p;
float paramExample = p.paramExample;
}

您需要考虑此解决方案是否足够“方便”以适应您的规模。

第二种解决方案:

public override void Setup(params object[] p ..)
{
// you need to know the arrangement of values inside the object array
float x = (float)p[0]; // not strictly speaking type-safe
}