2017-09-26 67 views
-2

不太确定如何用单线解释它,但这是我的情况。如何在现有类中添加类<T>的通用属性<T>

我有所谓的“新政”,它有一个属性它是一类“清单”

的抽象基类现在的交易可以是现金,金融,租赁,批发或租到 - 拥有这就是为什么它是交易类型。这也是抽象的,因为每种交易类型都有一些不适用于其他交易的属性,但它们都具有一组共享,因此各种交易类型(即金融,租赁等)从基本交易中继承并具有他们自己添加的方法和属性。

另一个抽象类“库存”也是如此。库存可以是汽车,卡车,小船,房车等),所以我有一类库存。

这里的问题:

协约必须包含一个单位库存。例如,您为一辆汽车融资或租赁一辆房车,然后您与库存类型的库存房产或任何情况下进行交易。

当我创建Deal类并且像SoldUnit一样向类型Inventory中添加属性时,T将继承Deal类。如何在Deal类中创建类型为Inventory的通用属性?

由于可能性的数量,交易并不会真正起作用,所以我如何制作一个通用的“SoldUnit”属性来引用Deal类中的库存类?同时保持严格的打字?我知道我可以用一种对象或动态方式创建一个名为SoldUnit的属性,但有没有更好的方法?

谢谢!

编辑:

对不起,这里是代码的摘录:它不工作,因为T型已经是一个交易类型,但它的两个属性[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(等)的方法是什么。

+0

谢谢。所以通过这样做,我需要为每个可能的组合单独分类?即 - '公共类现金:新政' '公共类现金:新政' '公共类现金:新政' '公共类现金:新政' ... '公共类车:库存' '公共类车:库存<金融,汽车>' '公共类车:库存' '公共类车:库存<批发,汽车>' ... 等。 –

相关问题