0

私はまだC#.NETに比較的慣れていないので、欠けていることは明らかですが、ここにあります。特定のクラスからいくつかの変数を取得するのに問題があります。

問題のクラスは次のようになります。

class AridPlanet : Arid
    {
        public const int area = 95;

    }

ご覧のとおり、このクラスは次のクラスを継承しています。

abstract class Arid : Astro
    {
        public const int metal = 2;
        public const int gas = 2;
        public const int crystals = 0;
        public const int fertility = 5;

    }

これは、次のクラスから継承されます。

abstract class Astro
    {
        public int metal;
        public int gas;
        public int crystals;
        public int fertility;
        public int area;

    }

私は次の変数を取得しようとします:

class Base
    {
        private int metal;
        private int gas;
        private int crystals;
        private int fertility;
        private int area;
        private List<Structure> structures = new List<Structure>();
        private int position;
        private Astro selectedAstro;

        public Base(Astro astro, int position)
        {
            this.selectedAstro = astro;
            this.metal = selectedAstro.metal;
            this.gas = selectedAstro.gas;
            this.crystals = selectedAstro.crystals;
            this.fertility = selectedAstro.fertility;
            this.area = selectedAstro.area;
            this.position = position;

        //Code ommited
    }
    }

パラメータは、たとえば、特定のastroタイプとしてコンストラクタにastro渡されます。BaseAridMoon

コードを実行してBase変数が何に割り当てられているかを確認すると、すべてが0に割り当てられていることがわかります。これは、コードが最上位のスーパークラスから変数を割り当てようとしていることを示していAridPlanetますAstro

ただし、継承について理解したように、コンパイラは、スーパークラスに移動する前に、最初に示されたクラスを確認する必要があります。

何が悪いのかについて何か考えはありますか?私が誤解しているのは単純なことだと確信しています。

4

3 に答える 3

2

Astro astroを参照すると、実際にはAstroで定義されている定数を取得します。そのサブクラスで定義された定数を取得するには、それを特定のサブクラスにキャストする必要があります。

おそらく探しているのは仮想プロパティです。

あなたは定義することができます

abstract class Base 
{
    abstract public int Metal { get; }
}

次に、その抽象メソッドをサブクラスに実装できます

public class AridPlanet : Base
{
    const int ARID_PLANET_METAL = 2;
    public override int Metal { get { return ARID_PLANET_METAL; } }
}

階層の中間レベルをスキップしましたが、うまくいけば、それが要点を示しています。中間クラスは、抽象定義をオーバーライドできます。それらのサブクラスは、オプションで追加のオーバーライドを提供するか、中間クラスからのオーバーライドを受け入れることができます。

于 2012-08-15T01:16:41.873 に答える
1

私はこれがあなたがすべきことだと思います:

class AridPlanet : Arid
{
    public AridPlanet()
    {
        area = 95;
    }
}

abstract class Arid : Astro
{
    public Arid()
    {
        metal = 2;
        gas = 2;
        crystals = 0;
        fertility = 5;
    }

}

次に、Astroクラスフィールドのアクセス修飾子をprotectedに変更し、パブリックアクセスでそれぞれの読み取り専用プロパティを作成します。

編集:

abstract class Astro
{
    protected int metal;
    protected int gas;
    protected int crystals;
    protected int fertility;
    protected int area;

    public int Metal { get { return metal; } }
    public int Gas { get { return gas; } }
    public int Crystals { get { return crystals; } }
    public int Fertility { get { return fertility; } }
    public int Area { get { return area; } }
}

class BaseCalc
{
    private int metal;
    private int gas;
    private int crystals;
    private int fertility;
    private int area;
    //private List<Structure> structures = new List<Structure>();
    private int position;
    private Astro selectedAstro;

    public BaseCalc(Astro astro, int position)
    {
        this.selectedAstro = astro;
        this.metal = selectedAstro.Metal;
        this.gas = selectedAstro.Gas;
        this.crystals = selectedAstro.Crystals;
        this.fertility = selectedAstro.Fertility;
        this.area = selectedAstro.Area;
        this.position = position;

        //Code ommited
    }
}
于 2012-08-15T02:47:06.000 に答える
1

ここで例を使用して、あなたが何をしているのかを説明しましょう。

  • クラス「Car」を作成し、車に必要ないくつかのプロパティを定義します
  • 「Car」クラスを拡張し、プロパティに値を割り当てるクラス「Sportscar」を作成します
  • クラス「Car」のインスタンスを使用して、なぜスポーツカーについて知らないのか不思議に思います。

ポリモーフィズムを使用しようとしているように見えます。各派生クラスが持つ必要のある情報と機能を決定する基本クラスとして、インターフェースまたは抽象クラス(Ericが示したように)を使用します。サブタイプの新しいインスタンスを作成するときは、インターフェイスのタイプとして保存でき、インスタンスへのすべての呼び出しはサブクラスに委任されます。重要な部分は、どのコンストラクターを呼び出すかです。

于 2012-08-15T01:37:23.943 に答える