如何制作派生方法,该方法采用与 C# 中的重写函数不同的参数

本文关键字:方法 重写 函数 参数 派生 何制作 | 更新日期: 2023-09-27 18:31:19

我有一个类,像这样:

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() 函数时,问题就来了,因为它们中的每一个都可以具有不同数量的参数。

那么问题来了 - 如何创建一个虚拟函数,该函数在派生类中的参数数量可以变化?

附言。我不想使用 params 关键字,因为我更希望类的用户确切地知道他必须传递给函数多少参数。

如何制作派生方法,该方法采用与 C# 中的重写函数不同的参数

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

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

在我看来,这些只是独立的方法。你可以有一个virtual方法,它接受一个数组(有或没有params),但你需要接受调用方可以提供任何大小。

这真的是不可能的。

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

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

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?

如果您改变参数,则得到的只是过载。

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

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 //!!