2017-09-26 10 views
-2

これを1行で説明する方法はわかりませんが、ここに私の状況があります。クラス<T>の汎用プロパティを既存のクラスの内部に追加する方法<T>

私は今、取引は現金、金融、リース、卸売または家賃ツーのいずれかになります

をクラス「インベントリ」であり、それに特性を持つ「ディール」と呼ばれる抽象基底クラスを持っていますそれはなぜそれがタイプのDealのそれであるか。各取引タイプには、他には適用されないいくつかのプロパティがありますが、それらはすべて共通のセットを持ち、さまざまな取引タイプ(つまり、Finance、Leaseなど)が基本クラスDealから継承され、独自のメソッドとプロパティを追加しました。

「インベントリ」という別の抽象クラスでも同じことが当てはまります。在庫は車、トラック、ボート、RVなどのようなものになる可能性があります)ので、私は在庫クラスを持っています。

ここに問題があります:

取引に在庫があるユニットが含まれている必要があります。たとえば、車の資金を調達したり、RVをリースしたりすると、インベントリタイプの在庫プロパティまたは場合によっては取引が発生します。

Dealクラスを作成し、SoldUnitのようなプロパティをInventory型として追加すると、TはDealクラスから継承されます。 Dealクラスの内部で在庫タイプの汎用プロパティを作成するにはどうすればよいですか?

可能性のために取引が実際には機能しないため、DealクラスのInventoryクラスを参照する一般的な「SoldUnit」プロパティを作成するにはどうすればよいですか?厳密な入力を維持しながら?私は、オブジェクトや動的な型のSoldUnitというプロパティを作ることができると知っていますが、より良い方法がありますか?

ありがとうございます!

EDIT:

申し訳ありませんが、ここでのコードの抜粋は以下のとおりです。型TはすでにDealTypeあるので、それは動作しませんが、それは私が移入しようとしているという二つの性質[ret.Vehicle = new Car();ret.SoldUnit = new Car();]ですGet()メソッドで特定の在庫タイプ(車、トラック、rv、ボートなど)を使用します。特定のインベントリタイプは、データベースフィールドのフラグによって決定されます。

もう一度おねがいします!

public abstract class Deal<T> 
{ 
    public string Uid { get; set; } = Guid.NewGuid().ToString(); 
    public DealTypes DealType { get; set; } = DealTypes.Finance; 

    public Buyer Customer { get; set; } 
    public Inventory<T> Vehicle { get; set; } 
    public Location Location { get; set; } 
    public Inventory<T> SoldUnit { get; set; } 

    public abstract T Add(string id); 
    public abstract T Update(string id); 
    public abstract T Get(string id); 
} 

public abstract class Inventory<T> 
{ 
    public string Uid { get; internal set; } = Guid.NewGuid().ToString(); 
    public Location Location { get; set; } 
    public string StockNumber { get; set; } = ""; 
} 

public class Cash : Deal<Cash> 
{ 
    public decimal TradeAllowance { get; set; } 
    public decimal TradePayoff { get; set; } 
    public decimal TotalDown { get; set; } 
    public decimal DueOnDelivery { get; set; } 

    public override Cash Get(string id) 
    { 
     var ret = new Cash(); 
     ret.Customer = new Buyer(); 
     ret.Vehicle = new Car(); 
     ret.Location = new Location(); 
     ret.SoldUnit = new Car(); 
    } 
} 

public class Car : Inventory<Car> 
{ 
    public decimal GrossWeight { get; set; } 
    public decimal NetWeight { get; set; } 
    public string Branded { get; set; } = ""; 
    public string FuelType { get; set; } = ""; 
    public string Trim { get; set; } = ""; 
    public string Body { get; set; } = ""; 
    public int Cylinders { get; set; } 
    public decimal EngineSize { get; set; } 
    public string TransmissionType { get; set; } = ""; 
    public string Suspension { get; set; } = ""; 
    public string InteriorColor { get; set; } = ""; 

    public bool OdometerExceedsLimit { get; set; } 
    public bool OdometerTrueMileageUnknown { get; set; } 
    public bool OdometerFiveDigit { get; set; } 


    public string TitleNumber { get; set; } = ""; 
    public DateTime? TitleDate { get; set; } 
    public string TitleState { get; set; } = ""; 
    public DateTime? TitleDue { get; set; } 
    public DateTime? TitleReceived { get; set; } 
} 
+10

一部のコードは、コンパイルしなくても、実際に問題を説明するのに役立ちます。 – CodeCaster

+2

'Deal 'と抽象クラスDealを宣言し、その 'T'を' Inventory '、' Deal 'に 'Inventory 'というプロパティで渡すことができるようです。しかし、あなたがやろうとしていることは本当にわかりません。 – CodeCaster

+0

クラスに複数の型引数を持たせる方法を尋ねていますか? – David

答えて

0

私はこの仕事をするために必要な要素まで多少コードを簡略化してきましたが、あなたはあなたの基底クラスがそれぞれDeal<D, I> where D : Deal<D, I> where I : Inventory<D, I> & Inventory<D, I> where D : Deal<D, I> where I : Inventory<D, I>のように定義されている必要があります。

あなたのコードは次のようになります。

public abstract class Deal<D, I> where D : Deal<D, I> where I : Inventory<D, I> 
{ 
    public I Vehicle { get; set; } 

    public abstract D Get(string id); 
} 

public abstract class Inventory<D, I> where D : Deal<D, I> where I : Inventory<D, I> 
{ } 

public class Cash : Deal<Cash, Car> 
{ 
    public override Cash Get(string id) 
    { 
     return new Cash() { Vehicle = new Car() }; 
    } 
} 

public class Car : Inventory<Cash, Car> 
{ } 

これは、あなたが強く型付けされたVehicle財産とGet(ETC)メソッドを持って何をする必要があるかです。

+0

ありがとうございます。だから、可能な組み合わせごとに別々のクラスが必要でしょうか?すなわち - 'パブリッククラス現金:ディール' 'パブリッククラス現金:ディール' 'パブリッククラス現金:ディール' 'パブリッククラス現金:ディール' ... 'パブリッククラス車:在庫 ' 'パブリッククラスの車:インベントリ<金融、車> ' 'パブリッククラスの車:在庫 ' 'パブリッククラスの車:在庫<卸売業、カー>> ... などです。 –

関連する問題