2017-03-13 5 views
-4

私はC#で実験していますが、どのように特定のクラスを型として持つことができるかを調べようとしています。クラスを型として作成するには?

シナリオ:

public class Car 
{ 
    public string Name { get; set; } 

    public Car() 
    { 

    } 
    public Car(string name, string type) 
    { 
     Name = name; 
     Type = type; 
    }  
} 

iはTypeプロパティを持っている車を希望:

私は車を持っています。私は上記の2車型クラスの「タイプ」を持つことができる方法Carクラス内

public class MonsterTruck 
{ 
    public int Lengt => 1; 
} 

public class SportTruck 
{ 
    public int Lengt => 3; 
} 

: 私は2つの車の種類がありますか?

+6

を、ルーク。 –

+1

あなたのタイプはあなたのタイプです。つまり'MonsterTruck'はあなたのタイプです、別の' type'プロパティ/フィールドは必要ありません。上記に欠けているのは、「MonsterTruck」が車の一種でなければならないということです。 '公共クラスMonsterTruck:Car'。 'SportTruck'と同じです。また[c#継承]も参照してください(https://msdn.microsoft.com/en-us/library/ms173149.aspx) – Igor

+0

私は理解していますかわかりません、私はある種の車を望んでいます。例:車はモンスタートラックや車はスポーツ用です – ThunD3eR

答えて

2

について移動するには、いくつかの異なる方法がありますこれはあなたの必要に応じて。

あなたが列挙型を作成することができますがCarTypeと呼ばれ、それがCarの性質も持っている:

public enum CarType 
{ 
    MonsterTruck, 
    SportTruck 
} 

public class Car 
{ 
    public CarType Type {get;set;} 
    //Rest of your code. 
} 

しかしこれは、代わりにCarType性を有するの継承

を学ぶのに最適な時間となり、 のフィールドを継承し、別の方法で処理することを許可した全く新しいクラスMonsterTruckがあるとします。結局のところ、異なった種類の車ですが、まだです。

例:

public class Car 
{ 
    public int CylinderCount {get;set;} 
    public double GasTankSize {get;set;} 
    public double Weight {get;set;} 

    public virtual string GetFormattedWeight() 
    { 
     return $"Your car's weight is {Weight}!" 
    } 
} 

public class MonsterTruck : Car 
{ 
    public override string GetFormattedWeight() 
    { 
     return $"Your monster truck's weight is {Weight}!" 
    } 
} 

後で、識別するために必要がある場合にtypeあなただけのクラスの実際のtypeチェックすることができます。

if(someInstance is MonsterTruck) 
{ 
    //this object is a MonsterTruck type 
} 
0

Carを継承し、子クラスのコンストラクタを使用してTypeを設定できます。
詳細については、下記のコードを参照してください。

public class MonsterTruck : Car 
{ 
    public int Lengt => 1; 

    public MonsterTruck() 
     : base(null, "MonsterTruck") 
    { 

    } 

    public MonsterTruck(string name) 
     : base(name, "MonsterTruck") 
    { 

    } 
} 

あなたはそれ自体の種類を知りたい場合は、次のように行うことができます。

Car myCar = new MonsterTruck(); 
if(myCar is MonsterTruck) 
{ 
    // do monster truck specific process 
} 
1

プログラミングでこれを行うための方法がたくさんあります。 1つの選択肢は継承を使用することですが、私は自分自身が継承から離れることを知っています。

このような注入/戦略を実行すると、システムの保守性と可読性が向上します。それをセットアップするにはもう少し作業が必要ですが、すぐに拡張して個々のコンポーネントをテストすることができるため、より良いソリューションを提供します。継承レイヤーを使って作業することは、適切に管理されなければ非常に苦痛になることがあり、ユニットテストの継承レイヤーは決して楽しいものではありません。何かの日常的な設定のIf/Else文を書くのは効率的ではありません:)

私は注射/戦略パターンをお勧めします。

私はそれに迅速フィドル作成:[継承](https://en.wikipedia.org/wiki/Inheritance_(オブジェクト-oriented_programming))を使用し https://dotnetfiddle.net/26u5ck

関連する問題