То, что вы видите, является другой стороной наследования.Наследование - это не просто сохранение себя при переписывании функций, существующих в другом классе.
Идея состоит в том, что если вы правильно спроектируете иерархию классов, вы можете использовать свои классы более безопасным образом во всем коде (благодаря тому, чтоC # строго типизирован).И, конечно, повторно используйте код, который можно использовать для целого семейства объектов, а не переписывайте его для каждого класса.
Давайте проанализируем силу приведенного вами примера.
Поскольку у вас есть известный интерфейс Animal, вам не нужно знать все типы животных, существующие в программе (классы, реализующие интерфейс).
Это позволяет вамкод, подобный следующему:
public interface Animal
{
void Play();
void WagTale();
void Eat(Food food);
}
}
void PlayWithAnimal(Animal animal) {
animal.WagTale();
this.ThrowBall();
animal.Play();
animal.WaTale();
}
Это будет работать точно так же для любого другого класса животных, который реализует этот интерфейс, независимо от того, как он реализован.
Таким образом, вы можете вызвать метод следующим образом:
Dog dog = new Dog();
Lion lion = new Lion();
Flee flee = new Flee();
PlayWithAnimal(dog);
PlayWithAnimal(lion);
PlayWithAnimal(flee);
Опять же, идея состоит в том, чтобы иметь возможность классифицировать ваши классы и использовать самые основные элементы, которые используют те же методы и члены в вашем коде.
Более ориентированный на C # пример:Image
- абстрактный класс, вы даже не можете создать экземпляр такого объекта.Но есть много других классов, которые являются производными от Image
, поэтому, хотя ни один объект не может быть реальным Image
, вы в основном увидите Image
в коде, который использует Images.(Опять же, в основном изображение на самом деле Bitmap
или какой-то другой класс)