Идентификация производных типов из списка объектов базового класса

Это может казаться видом "выхода домашней работы" и/или тривиальный, но это для реальной бизнес-цели; это - просто самый легкий способ, которым я мог думать для объяснения, что я концептуально пытаюсь сделать.

Предположим, что у меня есть класс Животных и некоторые другие классы (Птица, CAT, Кенгуру). Каждый из них наследовался Животному.

Животное могло бы быть похожим на это:

public class Animal
{
    public Animal()
    {

    }

    public string Name { get; set; }
    public string AnimalType { get; set; }
    public List<Animal> Friends { get; set; }
}

Кенгуру мог бы быть похожим на это:

public class Kangaroo : Animal
{
    public Kangaroo()
    {

    }

    public int TailLengthInches { get; set; }
}

Предположим, что у кенгуру есть два друга, птица и кошка. Как я мог добавить тех который к списку друзей "Животных" (как Животное типа), но сохранить способность получить доступ к свойствам производных классов? (как в, я все еще должен смочь работать со свойствами, которые характерны для типа животного, как FeatherColor для птицы, например, даже при том, что их будут считать просто "животными".

Причина, которую я пытаюсь сделать, это - то, что, когда я позже получаю список "друзей" животного, жизненно важно, чтобы я знал, какое животное друг. В зависимости от типа животных (является ли это птицей, кошкой, и т.д.) я хочу сделать что-то другое (покажите другой шаблон в на странице ASP.NET, на самом деле, но я не нуждаюсь в помощи с этим конкретно).

Я предполагаю, что это сводится к этому..., если у меня есть список Животного, как я знаю то, чем производный тип был для каждого из объектов в списке, таким образом, я могу бросить их назад к их производному типу или сделать что-то еще, что позволяет мне добираться до определенных, различных свойств, которые находятся на каждом производном типе?

Спасибо!

5
задан itowlson 15 January 2010 в 21:07
поделиться

5 ответов

Вы можете использовать LINQ для фильтрации на типе, который вы ищете

animals.Friends = new List<Animal> { new Kangaroo(), new Bird() };
foreach ( var kangaroo in animals.Friends.OfType<Kangaroo>()) {
  kangaroo.Hop();
}
8
ответ дан 13 December 2019 в 19:27
поделиться

Как говорили другие, вы должны использовать Flash для получения нескольких загрузок. Альтернативой загрузке является SWFUpload .

-121--3060210-

Поскольку для ClassValidator в качестве параметра требуется объект Class, экземпляр данного класса НЕ является. Помните, что вы можете делать то, что пытаетесь сделать с помощью этого кода:

ClassValidator<? extends T> validator = new ClassValidator<? extends T>(validateMe.getClass());
-121--3959400-

Можно использовать тип для получения фактического типа или использовать операторы является или в качестве для тестирования и (необязательно) приведения:

foreach (Animal a in Friends)
{
  Kangaroo k = a as Kangaroo;
  if (a != null)
  {
    // it's a kangaroo
    k.JumpAround();
  }
  Ostrich o = a as Ostrich;
  if (o != null)
  {
    o.StickHeadInSand();
  }
}

(Я не использовал здесь else , что может привести к ошибкам при тестировании на типы, которые могут быть в иерархии, например, если у вас были и предложения Kangaroo и Marsupial, вы, вероятно, НЕ хотите, чтобы оба были выполнены!)

Вы также можете сделать это с помощью оператора is ,

foreach (Animal a in Friends)
{
  if (a is Kangaroo)
  {
    ((Kangaroo)a).JumpAround();
  }
}

В целом, по пути, вы, вероятно, хотите искать возможность поставить виртуальный метод на Animal и реализовать этот метод полиморфно, вместо того, чтобы иметь операторы monster if-, которые приводят к хрупкой связи с определенным набором производных классов.

1
ответ дан 13 December 2019 в 19:27
поделиться

Попробуйте лить его:

var friendBird = friend as Bird;
if (friendBird != null)
{
    // It's a bird, so do something with it
)
2
ответ дан 13 December 2019 в 19:27
поделиться
animals.Friends = new List<Animal> { new Kangaroo(), new Bird() };
foreach (Animal animal in animals.Friends)
{
if (animal is Kangaroo)
Console.WriteLine("Kangaroo");
else if (animal is Bird)
Console.WriteLine("Bird");
}
0
ответ дан 13 December 2019 в 19:27
поделиться

Используйте ключевое слово «IS».

Если (животное - это птица) ...

0
ответ дан 13 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: