如何在现有Class <t>

时间:2017-09-26 14:54:09

标签: c# generics

不确定如何在单行中解释它,但这是我的情况。

我有一个名为“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; }
}

1 个答案:

答案 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(等)方法。