Расширение объекта и каких-либо дочерних коллекций? - PullRequest
0 голосов
/ 30 июля 2009

У меня есть класс с именем Foo. Этот класс содержит коллекцию дочерних объектов типа FooChildBase, но у меня также есть дополнительный класс типа FooChildTwo, который наследуется от FooChildBase.

Class Foo
  Public Children As IList(Of FooChildBase)
End Class

Class FooChildBase
  Public Info As String
End Class

Class FooChildTwo
  Inherits FooChildBase

  Public ExtraInfo As String
End Class

Это все отлично работает. Теперь мне нужно использовать специализацию моего объекта Foo с дополнительной информацией.

Class FooSpecial
  Inherits Foo

  Public SpecialInfo As String
End Class

Class FooChildSpecial
  Inherits FooChildBase

  Public SpecialChildInfo As String
End Class

То, что я хотел бы сделать, - это чтобы мой класс FooSpecial рассматривал его коллекцию Children как объекты FooChildSpecial, но при этом имел возможность добавлять к нему объекты FooChildTwo. Возможно ли это, и если да, то как это можно сделать?

EDIT Я думаю, что мой первоначальный вопрос был неверным. Мне нужен класс FooChildSpecial, чтобы обернуть любой из объектов в коллекции Children дополнительными значениями, будь то FooChildBase или FooChildTwo или XXX.

Надеюсь, это имеет смысл! Пожалуйста, дайте мне знать, если понадобятся дополнительные разъяснения.

Джеймс

Ответы [ 3 ]

1 голос
/ 30 июля 2009

Чтобы FooSpecialChild "обернул" FooChildTwo, он должен либо наследовать от него, либо реализовать тот же интерфейс (IFooChildTwo). К сожалению, вы не можете условно наследовать или реализовывать ... это всегда или никогда. Таким образом, ваш класс FooSpecialChild может наследовать от FooChildTwo, но тогда он всегда будет FooChildTwo. То же самое, если он реализует тот же интерфейс, что и FooChildTwo.

Выложенный вами шаблон дизайна будет работать правильно. Поскольку FooChildSpecial и FooChildTwo наследуют один и тот же базовый класс, а список относится к этому типу базового класса, он сработает. Вам просто нужно проверить тип объекта при извлечении из свойства .Children.

После копирования + вставки вашего кода в пример проекта, я мог бы успешно сделать:

  var foo = new Foo();
  foo.Children = new List<FooChildBase>();
  var special = new FooChildSpecial();
  special.SpecialChildInfo = "special";
  foo.Children.Add(special);
  var two = new FooChildTwo();
  two.ExtraInfo = "two";
  foo.Children.Add(two);

Что показывает, что вы можете добавить как FooChildSpecial, так и FooChildTwo в свой исходный список.

0 голосов
/ 30 июля 2009

Вы можете сделать это с помощью обобщений, у которых есть базовый класс, содержащий список типов T. Когда вы определяете Foo и FooSpecial, вы указываете, что такое T.

0 голосов
/ 30 июля 2009

Что вы подразумеваете под "трактовать, как если бы они были объектами FooChildSpecial"? Вы имеете в виду методы доступа, которые существуют только в объектах FooChildSpecial?

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

Однако лучше просто позволить FooSpecial обрабатывать их как объекты FooChildBase, но иметь в FooChildSpecial и FooChildTwo, которые переопределяют базовые методы, чтобы получить различное поведение для двух подклассов.

У меня также есть ощущение, что вам действительно не нужен класс FooSpecial, но я могу ошибаться. Я подозреваю, что дополнительная информация и специальная информация могут быть просто объединены в «информацию», и если им нужны разные типы информации для инициализации класса с разными типами.

...