Конечно, нет проблем.
Dog dog = myAnimal as Dog;
Bird bird = myAnimal as Bird;
if (dog != null)
KennelMethod(dog.Kennel);
else if (bird != null)
NestMethod(bird.Nest);
Однако я бы рекомендовал избегать этой ситуации в первую очередь.Если у вас есть метод, который принимает животное, но на самом деле ожидает собаку или птицу, то это звучит так, как будто вы действительно хотите два метода , один из которых принимает собаку, а другой - птицу.1007 *
Если возможно, я бы не стал загромождать классы Dog и Bird отдельными абстрактными методами.Я также хотел бы, чтобы это было легко масштабируемым, чтобы у меня могли быть сотни различных «животных», происходящих из Animal.
Ваши требования несколько противоречивы;Вы не хотите кодировать информацию об иерархии типов в самом коде типа , поэтому этот материал должен находиться за пределами иерархии типов, и поэтому у вас есть проблема с масштабируемостью.
Вы рассматривали использование шаблона посетителя?Это довольно стандартный способ виртуальной диспетчеризации типа объекта во время выполнения, но с кодом, который фактически выполняется, существующим вне класса.