Переопределение функции с наследованием аргумента - PullRequest
0 голосов
/ 04 августа 2010

У меня есть класс списка общих элементов, чтобы создать более конкретный список с использованием его в качестве базового класса, что-то вроде этого.

ref class ItemBase { }
ref class ItemA : ItemBase { }
ref class ItemList abstract {
 public:
  virtual void add(ItemBase ^p);
}
ref class ItemListA : ItemList {
 public:
  virtual void add(ItemA ^p) override; // it doesn't works :(
}

Я хочу ограничить добавление определенного типа элементов в каждом классе.

1 Ответ

2 голосов
/ 04 августа 2010

Принятым шаблоном для этого является метод базового класса protected:

ref class ItemBase { }
ref class ItemA : ItemBase { }
ref class ItemList abstract {
 protected:
  virtual void addInternal(ItemBase ^p);
}
ref class ItemListA : ItemList {
 public:
  virtual void add(ItemA ^p){addInternal(p);} 
}

Вот лучшее решение с использованием обобщений.Обратите внимание, как мы ограничиваем универсальный параметр T до ItemBase, чтобы обеспечить использование этой коллекции только с ItemBase или его подклассами.

ref class ItemBase { };
ref class ItemA : public ItemBase { };

generic <class T>
where T: ItemBase
ref class ItemList abstract {
 public:
     virtual void Add(T p){}
};

ref class ItemListA : ItemList<ItemA^> {
   //no need to override Add here
};

//usage
int main(array<System::String ^> ^args)
{
    ItemListA^ list = gcnew ItemListA();
    list->Add(gcnew ItemA());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...