Это может казаться видом "выхода домашней работы" и/или тривиальный, но это для реальной бизнес-цели; это - просто самый легкий способ, которым я мог думать для объяснения, что я концептуально пытаюсь сделать.
Предположим, что у меня есть класс Животных и некоторые другие классы (Птица, 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, на самом деле, но я не нуждаюсь в помощи с этим конкретно).
Я предполагаю, что это сводится к этому..., если у меня есть список Животного, как я знаю то, чем производный тип был для каждого из объектов в списке, таким образом, я могу бросить их назад к их производному типу или сделать что-то еще, что позволяет мне добираться до определенных, различных свойств, которые находятся на каждом производном типе?
Спасибо!
Вы можете использовать LINQ для фильтрации на типе, который вы ищете
animals.Friends = new List<Animal> { new Kangaroo(), new Bird() };
foreach ( var kangaroo in animals.Friends.OfType<Kangaroo>()) {
kangaroo.Hop();
}
Как говорили другие, вы должны использовать 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-, которые приводят к хрупкой связи с определенным набором производных классов.
Попробуйте лить его:
var friendBird = friend as Bird;
if (friendBird != null)
{
// It's a bird, so do something with it
)
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");
}
Используйте ключевое слово «IS».
Если (животное - это птица) ...