3

「仮想」メンバーと「静的」メンバーの概念が構文的および概念的に正反対であることはわかっていますが、限界を少し押し上げて、次のことを達成する方法があるかどうかを確認しようとしています。

Animalプロパティを持つ抽象クラスがあるとしましょうNumberOfLegs。私CatのクラスはNumberOfLegs4 と定義されているSpiderはずですが、脚は 8 つあるはずです。次のようなコードが必要です (明らかに、以下のコードはコンパイルされません)。

public abstract class Animal {
  public static abstract int NumberOfLegs { get; }

  public void Walk() {
    // do something based on NumberOfLegs
  }
}

public class Cat : Animal {
  public static override int NumberOfLegs { get { return 4; } }
}

public class Spider : Animal {
  public static override int NumberOfLegs { get { return 8; } }
}

インスタンスに依存しないため、静的にしたい。サブクラスの型のみに依存します。

これをどのように行いますか?

4

1 に答える 1

0

あなたにとって最善の妥協点は、各クラスで脚の数の定数を作成することだと思います。定数は基本的に読み取り専用の静的メンバーであり、この例では意味があり、それ以外の場合は静的になります。

次に、Animal クラスの抽象プロパティを定義し、各サブクラスをオーバーライドします。これにより、継承とポリモーフィズムが機能しますが、クラスの各インスタンスは引き続き同じ値を参照します。

public abstract class Animal
{
    public abstract int NumberOfLegs { get; }

    public void Walk()
    {
        // do something based on NumberOfLegs
    }
}

public class Cat : Animal
{
    private const int NumLegs = 4;

    public override int NumberOfLegs { get { return NumLegs; } }
}

public class Spider : Animal
{
    private const int NumLegs = 8;

    public override int NumberOfLegs { get { return NumLegs; } }
}

静的メソッドをオーバーライドしない限り、聞きたいことではないことはわかっていますが、それは不可能です。まず、オブジェクトのインスタンスからではなく、クラスを指定して Animal.Legs や Cat.Legs などの静的メンバーを使用します。したがって、静的として定義すると、クラスのインスタンスからアクセスすることさえできず、ポリモーフィズムの概念もありません (つまり、一般的な「動物」を受け入れる関数は、それが持っている足の数を取得できません)。正しいプロパティを呼び出すようにします)。これがどのように機能するかに興味がある場合は、仮想テーブルについて読むことをお勧めします

于 2012-10-11T14:24:38.813 に答える