Как сказал Сергей, речь идет не только о конструкторах. Это избавляет вас от необходимости повторять инициализацию одних и тех же полей снова и снова. Например,
Без наследования
class Cat
{
float height;
float weight;
float energy;
string breed;
int somethingSpecificToCat;
public Cat()
{
//your constructor. initialize all fields
}
public Eat()
{
energy++;
weight++;
}
public Attack()
{
energy--;
weight--;
}
}
class Dog
{
float height;
float weight;
float energy;
string breed;
int somethingSpecificToDog;
public Dog()
{
//your constructor. initialize all fields
}
public Eat()
{
energy++;
weight++;
}
public Attack()
{
energy--;
weight--;
}
}
с наследованием
Все, общие для животных получает переехал в базовый класс. Таким образом, если вы хотите настроить новое животное, вам не нужно вводить его снова.
abstract class Animal
{
float height;
float weight;
float energy;
string breed;
public Eat()
{
energy++;
weight++;
}
public Attack()
{
energy--;
weight--;
}
}
class Cat : Animal
{
int somethingSpecificToCat;
public Cat()
{
//your constructor. initialize all fields
}
}
class Dog : Animal
{
int somethingSpecificToDog;
public Dog()
{
//your constructor. initialize all fields
}
}
Еще одно преимущество заключается в том, если вы хотите, чтобы пометить каждое животное с уникальным ID, вам не нужно включать, что в каждом конструкторе и сохранить глобальную переменную последнего ID используется. Вы можете легко сделать это в конструкторе Animal, так как он будет вызываться каждый раз, когда создается производный класс.
Пример
abstract class Animal
{
static int sID = 0;
float height;
float weight;
int id;
public Animal()
{
id = ++sID;
}
}
Теперь, когда вы делаете;
Dog lassie = new Dog(); //gets ID = 1
Cat garfield = new Cat(); // gets ID = 2
Если вы хотите получить список всех животных в вашей 'фермы',
без наследования
List<Cat> cats = new List<Cat>(); //list of all cats
List<Dog> dogs = new List<Dog>(); //list of all dogs
...etc
С наследованием
List<Animal> animals = new List<Animal>(); //maintain a single list with all animals
animals.Add(lassie as Animal);
animals.Add(garfield as Animal);
Таким образом, если вы хотите t о если у вас есть животное под названием Pluto
, вам просто нужно перебирать один список (животных), а не несколько списков (кошки, собаки, свиньи и т.д.)
EDIT в ответ на ваш комментарий
Вам не нужно создавать экземпляр Animal. Вы просто создаете объект того животного, которого хотите. Фактически, поскольку Animal никогда не будет общим Animal, вы можете создать Animal
как абстрактный класс.
abstract class Animal
{
float height;
float weight;
float energy;
string breed;
public Eat()
{
energy++;
weight++;
}
public Attack()
{
energy--;
weight--;
}
}
class Cat : Animal
{
int somethingSpecificToCat;
public Cat()
{
//your constructor. initialize all fields
}
}
class Dog : Animal
{
int somethingSpecificToDog;
public Dog()
{
//your constructor. initialize all fields
}
}
Cat garfield = new Cat();
garfield.height = 24.5;
garfield.weight = 999; //he's a fat cat
//as you can see, you just instantiate the object garfield
//and instantly have access to all members of Animal
Animal jerry = new Animal(); //throws error
//you cannot create an object of type Animal
//since Animal is an abstract class. In this example
//the right way would be to create a class Mouse deriving from animal and then doing
Mouse jerry = new Mouse();
Edit на ваш комментарий
Если вы храните его в списке животных, вы по-прежнему иметь доступ ко всем полям. Вам просто нужно вернуть его в исходный тип.
List<Animal> animals = new List<Animal>();
animals.Add(garfield as Animal);
animals.Add(lassie as Animal);
//if you do not cast, you cannot access fields that were specific to the derived class.
Console.WriteLine(animals[0].height); //this is valid. Prints Garfield's height
Console.WriteLine(animals[0].somethingSpecificToCat); //invalid since you haven't casted
Console.WriteLine((animals[0] as Cat).somethingSpecificToCat); //now it is valid
//if you want to do it in a loop
foreach(Animal animal in animals)
{
//GetType() returns the derived class that the particular animal was casted FROM earlier
if(animal is Cat)
{
//the animal is a cat
Cat garfield = animal as Cat;
garfield.height;
garfield.somethingSpecificToCat;
}
else if (animal is Dog)
{
//animal is a dog
Dog lassie = animal as Dog;
lassie.height;
lassie.somethingSpecificToDog;
}
}
Вы запутались в своем примере. Например, только у кошек есть зубы или все животные? Позволяет ради аргумента сказать, что все животные (в основном правильное утверждение) - то не должны ли зубы быть частью вашего базового класса? –
Ну, это был всего лишь пример, у меня будет несколько категорий и видов, и у каждого вида будет уникальное поле, но затем изменим это на усы: p. – Gvs
@ user1083543: Кажется, что это какое-то задание домашней работы/класса. По этой причине, может быть много преимуществ Наследования, что это конкретное задание не будет заставлять вас использовать рычаги. Но цель задания - познакомить вас с наследованием, чтобы, когда вам это действительно нужно, вы можете использовать его. – xbonez