Перегрузка BindingList <T>родительского свойства с подклассом T - PullRequest
2 голосов
/ 09 марта 2009

У меня возникли проблемы с идеей, что в самом простом случае кажется, что она должна работать.

Я пытаюсь перегрузить свойство типа BindingList<T> в подклассе с BindingList из <subclasss T>. Есть способы, которыми я могу обойти это, но кажется, что «самый хороший» способ был бы без какого-либо прямого приведения. Я перепробовал множество вариантов и у меня есть некоторые решения, но я не особо доволен ни одним из них.

Есть ли лучший подход к этому? Пример кода simple может быть лучшим дескриптором В этом примере ниже я хочу получить фруктовый шар, содержащий только яблоки, но использую одно и то же имя свойства для доступа к BindingList<> яблок (в случае подкласса; универсальный фрукт в случае суперкласса). *

-------- Пример -------

class Fruit{}
class Apple: Fruit {}

class FruitBowl
{
  protected BindingList<Fruit>  m_aFruits;

  public BindingList<Fruit> Fruits
  {
    get {return m_aFruits;}
  }
}

class AppleBowl : FruitBowl
{
  public BindingList<Apple> Fruits
  {
    get {return m_aFruits;}
  }
}

Ответы [ 2 ]

2 голосов
/ 09 марта 2009

То, что вы пытаетесь сделать, известно как Co / Contra Variance. К сожалению, это не поддерживается на конкретных типах в C # (доступно на интерфейсах только для C # 4.0). Учитывая реализацию BindingList , невозможно делать то, что вы хотите, и поддерживать только один список.

Вы можете попытаться подделать это несколькими способами. Один из способов обойти это - использовать IEnumerable только для подкласса. В этом случае простой запрос LINQ сделает свое дело.

class AppleBowl : FruitBowl
{
  public IEnumerableApple> TypedFruits
  {
    get {return base.Fruits.Cast<Apple>();}
  }
}
1 голос
/ 09 марта 2009
class FruitBowl<T> where T : Fruit //this requires T to inherit from Fruit
{
    protected BindingList<T> Fruits;
}

class AppleBowl : FruitBowl<Apple>
{
    //AppleBowl will have an inherited property Fruits 
    //of type BindingList<Apple>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...