2011-10-05 54 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