2011-10-05 92 views
0

我想爲Transaction,Order和OrderCollection使用一些基本的抽象類。 TransactionCog繼承Transaction和OrderCollection繼承List和OrderCogCollection繼承OrderCollection和OrderCog繼承Order。 TransactionCog必須有OrderCogCollection的成員。具有通用列表的抽象屬性的C#抽象類覆蓋

我想使用事務有一個OrderCollection的抽象屬性,以便TransactionCog必須重寫屬性,但使用一種OrderCogCollection來代替。當然,我現在要去的方式是給我一個TransactionCog沒有實現繼承的抽象成員。

我想這樣做,如果我有一個小工具或齒輪命令下一步,我從基地繼承,它迫使我用相應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

覆蓋必須保持宣言的簽名是多態的,所以你的情況:

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; } 
} 
+0

對不起,長期走在這,就死在那了我遠離這方面的工作最壞的一面項目。我看到你在這裏嘗試,但是當做你的覆蓋,我得到一個錯誤的get和set不能隱式地將OrderCollection 轉換爲OrderCogCollection 。 – langc334