Нужно абстрагировать коллекции объектов (C #) - PullRequest
1 голос
/ 21 декабря 2010

В следующем упрощенном примере мне нужно абстрагировать классы Collection таким образом, чтобы PrintFruitsAndEaters(oranges, orangeEaters); или PrintFruitsAndEaters(apples, appleEaters); становится возможным:

abstract class Fruit
abstract class FruitEater

class Apple : Fruit
class AppleEater : FruitEater
class Orange : Fruit
class OrangeEater : FruitEater

class AppleCollection : List<Apple>
class OrangeCollection : List<Orange>
class AppleEaterCollection : List<AppleEater>
class OrangeEaterCollection : List<OrangeEater>

Я пытался шаблонизировать классы методов и коллекций, но мне нужно получить доступ к методам, специфичным для классов Fruit и FruitEater:

class FruitCollection<T> : List<T>
class FruitEaterCollection<T> : List<T>

void PrintFruitsAndEaters<T, S>(FruitCollection<T> fruits, FruitEaterCollection<S> eaters)

1 Ответ

6 голосов
/ 21 декабря 2010

Тогда вы хотите это:

void PrintFruitsAndEaters<T, S>(
    FruitCollection<T> fruits,
    FruitEaterCollection<S> eaters)
        where T : Fruit
        where S : FruitEater
{
    // ...
}

Это ограничит типы T и S, как вам требуется;вызов метода с FruitCollection<T>, где нельзя гарантировать, что T будет Fruit или подтипом, приведет к ошибке во время компиляции.То же самое с S и FruitEater.

Из-за ограничения при работе со значением типа T вы сможете получить доступ к членам класса Fruit, а также при работе сзначение типа S вы сможете получить доступ к членам класса FruitEater.

Обратите внимание, что в соответствии с (удаленным) ответом Брайана вы можете добавить ограничения и к типам коллекций:

class FruitCollection<T> : List<T> where T : Fruit { }
class FruitEaterCollection<T> : List<T> where T : FruitEater { }

Но это все равно не позволит вам опустить ограничения метода.

(Кроме того, наследование List<T> - это зло, вместо этогоиспользуйте IList<T>)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...