不确定如何在单行中解释它,但这是我的情况。
我有一个名为“Deal”的抽象基类,其中包含一个属性为“Inventory”的属性
现在交易可以是现金,财务,租赁,批发或自租,这就是为什么它的类型为Deal。它也是抽象的,因为每种交易类型都有一些不适用于其他交易的属性,但它们都有一组共享,因此各种交易类型(即 - 财务,租赁等)继承自基类交易并拥有他们自己添加的方法和属性。
另一个抽象类“库存”也是如此。库存可以是汽车,卡车,船,房车等等。因此我有一类库存。
问题在于:
交易必须包含库存中的单位。例如,您为汽车提供资金或租赁房车,然后您就可以处理库存类型或任何情况下的库存属性。
当我创建Deal类并且我像SoldUnit一样向它添加属性作为类型Inventory时,T继承自Deal类。如何在Deal类中创建Inventory类型的通用属性?
由于可能性很多,交易不会真正起作用,那么我如何制作一个通用的“SoldUnit”属性来引用Deal类中的Inventory类?在保持严格打字的同时?我知道我可以使用一种对象或动态创建一个名为SoldUnit的属性,但有更好的方法吗?
谢谢!
编辑:
很抱歉,这里是代码的摘录:它不起作用,因为类型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; }
}
答案 0 :(得分:0)
我已经将代码简化为必要的元素以使其工作,但您需要将基类定义为Deal<D, I> where D : Deal<D, I> where I : Inventory<D, I>
&amp;分别为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
(等)方法。