如何创建一个派生方法,它采用不同于C#中覆盖函数的参数?

时间:2012-04-16 09:32:07

标签: c#

我有一个课程,类似这样:

class BaseClass
{
  protected int X;
  virtual void ChangeParameters(int NewX)
  {
    this.X = newX;
  }
}

class DerivedClass1 : BaseClass
{
  private int a;
  private int b;
}

class DerivedClass2 : BaseClass
{
  private int a;
}

当我想在派生类中覆盖ChangeParameters()函数时出现问题,因为它们中的每一个都可以有不同数量的参数。

所以这就是问题 - 如何创建一个虚函数,它可以在派生类中的参数数量上有所不同?

PS。我不想使用params关键字,因为我更喜欢该类的用户确切地知道他必须传递给函数的参数数量。

3 个答案:

答案 0 :(得分:4)

你做不到。如果是override,则签名必须才能完全匹配。如果你想要不同的参数,它听起来不像override - 毕竟......只要知道基本类型,调用者如何调用它? (替代校长等)

BaseClass obj = GetSomeConcreteObject(); // actually a DerievedClass2
obj.ChangeParameters({what would go here?});

听起来我觉得这些只是独立的方法。你可以拥有一个virtual方法来获取一个数组(有或没有params),但是你需要接受调用者可以提供任何大小。

答案 1 :(得分:3)

这不太可能。

根据定义,覆盖必须保持与原始方法相同的名称和参数集(也称为签名)。

如果您使用不同的参数,运行时如何将您的“覆盖”绑定到超类上的方法调用?想象一下这是可能的:

class A
{
    virtual void Foo(int i) { Console.WriteLine(i); }
}

class B : A
{
    override void Foo(int i, int j) { Console.WriteLine(i + j); }
}

// somewhere else

void DoSomething(A a)
{
    a.Foo(1);
}

// later

DoSomething(new B()); // how will b.Foo get called inside DoSomething?

如果你改变参数,你得到的只是一个过载。

答案 2 :(得分:0)

有趣的技巧也可以使用可选参数完成,如下所示:

public class Base
{
     public virtual void DoSomething(string param="Hello", string param1 = "Bye") 
     {

    Console.WriteLine(string.Format("prm: {0}, prm1: {1}", param, param1));
     }
}

public class Derived  : Base
{
    public override void  DoSomething(string param="Ciao", string param1="Ciao")
    {
          Console.WriteLine(string.Format("prm: {0}, prm1: {1}", param, param1));
    }
}

所以你可以在代码中使用:

Base a = new Derived();
a.DoSomething();

输出是:

prm: Hello, prm1: Bye

但你现在可以这样:

Base a = new Derived();
a.DoSomething("Ciao");

并输出如下:

prm: Ciao, prm1: Bye //!!