带有Generic List覆盖的抽象属性的C#抽象类

时间:2011-10-05 18:41:36

标签: c# list generics properties abstract

我正在尝试为Transaction,Order和OrderCollection使用一些基本抽象类。 TransactionCog继承Transaction和OrderCollection继承List和OrderCogCollection继承OrderCollection,OrderCog继承Order。 TransactionCog必须具有OrderCogCollection的成员。

我正在尝试使用Transaction来获得OrderCollection的抽象属性,以便TransactionCog必须覆盖该属性,而是使用OrderCogCollection类型。当然,我现在的方式是给我一个TransactionCog不实现继承的抽象成员。

我正在尝试这样做,以便如果我接下来要订购Widget或Gear,我会从基地继承并强制我使用相应的Order' ItemName' Collection覆盖该属性。造成这种情况的部分原因是每个Order' ItemName' Collection都会拥有一些其他人不会拥有的特殊功能和属性。如果可能的话,我很难看到我应该在哪里工作。

public abstract class Transaction
{
    public abstract OrderCollection<Order> Orders
    { get; set; }
}

public abstract class Order
{
    private int _id;

    public int ID
    {
        get { return _id; }
        set { _id = value; }
    }
}

public abstract class OrderCollection<T> : System.Collections.Generic.List<T>
{
    abstract public int GetIntValue(int test);
}

class OrderCog : TestWindowsFormCsharp.Classes.BaseClasses.Order
{
    public OrderCog()
    {
    }
}

public class OrderCogCollection<OrderCog> : TestWindowsFormCsharp.Classes.BaseClasses.OrderCollection<OrderCog> 
{
    public OrderCogCollection()
    {
    }

    public override int GetIntValue(int test)
    {
        return test;
    }
}

class TransactionCog : TestWindowsFormCsharp.Classes.BaseClasses.Transaction
{
    private OrderCogCollection<OrderCog> cogs;

    public TransactionCog()
    {
    }

    public override OrderCogCollection<OrderCog> Orders
    {
        get { return cogs; }
        set { cogs = value; }
    }

}

1 个答案:

答案 0 :(得分:1)

覆盖必须使声明签名保持多态,因此在您的情况下:

public override OrderCollection<Order> Orders
{
    get { return cogs; }
    set 
    {
        // assert value is OrderCogCollection<OrderCog>  
        cogs = (OrderCogCollection<OrderCog>)value; 
    }
}

public OrderCogCollection<OrderCog> OrderCogs
{
    get { return cogs; }
    set { cogs = value; }
}