1

次のようなクラスがあります。

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 キーワードを使用したくありません。クラスのユーザーが、関数に渡さなければならないパラメーターの数を正確に把握できるようにしたいからです。

4

3 に答える 3

4

それはいけません。の場合override、署名は完全に一致する必要があります。異なるパラメーターが必要な場合、それはoverride- 結局のところ... ベース タイプだけを知っている呼び出し元はどのように呼び出すのでしょうか? (代替元本等)

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

これらは独立した方法にすぎないように思えます。配列を受け取るメソッド ( の有無にかかわらず) を使用できますが、呼び出し元が任意のサイズを指定できることを受け入れる必要があります。virtualparams

于 2012-04-16T09:33:54.770 に答える
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?

パラメータを変更すると、オーバーロードだけが得られます。

于 2012-04-16T09:34:26.690 に答える
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 //!! 
于 2012-04-16T09:48:04.050 に答える