3

新しいコードを機能させようとして、こぶをつぶしてきました。これは、if ステートメントを使用して、より単純で広範な方法で行うことができました。ただし、これはアプリケーションのバージョン 2 になるため、コードをもう少しクリーンで効率的にしたいと考えています。

私がやろうとしているのは、条件付きでクラスをインスタンス化することです。次のようになります。

int Airplane = 195;

if (Airplane == 190)
    _E190 Aircraft = new _E190();

else if (Airplane == 195)
    _E195 Aircraft = new _E195();

私は両方のクラスを持っていますが、「航空機」というキーワードを使用したいので、クラスごとにコードの複数の部分を作成する必要はありません。また、C# では多重継承 (私の意見では、これでうまくいくと思います) を使用できないこともわかりました。この言語は比較的新しい言語です。

これまでのところ、クラスを希望どおりにインスタンス化することはできましたが、各クラス内で宣言された変数を使用できないようです。私はこれをしました:

    int Airplane = 195;

    var Aircraft = Activator.CreateInstance( (Airplane == 195) ? typeof(_E195) : typeof(_E190));
    MessageBox.Show(Aircraft.GetType().ToString());

MessageBox には型が正しく表示されますが、「Aircraft」オブジェクトを使用してクラス自体にアクセスすることはできません。これを行う方法は他にもあると確信していますが、どれも私にとっては問題ありません。

ありがとう!

4

3 に答える 3

12

私はそれらがそれぞれ他のものから継承されていると思います、そしてそれがあなたが多重継承を必要とする理由ですか?

インターフェイス(IAircraft)を作成し、両方に実装してもらいます。

interface IAircraft {
    /* Common methods here */
}

class _E190 : TheParentClass, IAircraft {
    /* Your code */
}

class _E195 : TheOtherParentClass, IAircraft {
    /* Your code */
}

/* ... */

int Airplane = 195;
IAircraft Aircraft;

if (Airplane == 190)
    Aircraft = new _E190();
else if (Airplane == 195)
    Aircraft = new _E195();

以前のメソッドを使用してクラスにアクセスできない理由は、そのために、コンパイラがクラスのタイプを認識している必要があるためです。そのためには、適切なタイプにキャストする必要があります...しかし、それは同じ問題にすぐに戻ります。リフレクションメソッドを使用してそれを続行することもできますが、継承または実装を使用する方がはるかに効率的でクリーンです。

于 2011-07-13T14:06:59.260 に答える
4

次のように定義してみませんか?

public abstract class Aircraft
{
}

public class _E190 : Aircraft
{
}


public class _E195 : Aircraft
{
}

次に、次の操作を行います。

Aircraft Aircraft;
int Airplane = 195;

if (Airplane == 190)
    Aircraft = new _E190();

else if (Airplane == 195)
    Aircraft = new _E195();

編集:さらに、他の人が提案しているように、抽象クラスの代わりにインターフェイスを利用できます。この場合、共通のプロパティとメソッドがあれば、すべて二重定義する必要があることに注意してください。

于 2011-07-13T14:08:36.393 に答える
2

オブジェクト ファクトリ パターンを読んでください。

于 2011-07-13T14:07:51.490 に答える