C # абстрактный класс с абстрактным свойством переопределения универсального списка - PullRequest
0 голосов
/ 05 октября 2011

Я пытаюсь использовать некоторые базовые абстрактные классы для Transaction, Order и OrderCollection.TransactionCog наследует Transaction и OrderCollection наследует List, а OrderCogCollection наследует OrderCollection и OrderCog наследует Order.TransactionCog должен иметь член OrderCogCollection.

Я пытаюсь использовать Transaction, чтобы иметь абстрактное свойство 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 Ответ

1 голос
/ 05 октября 2011

Переопределение должно сохранять полиморфность подписи объявления, поэтому в вашем случае:

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; }
}
...