Vedavyas Velaga Ответов: 3

В чем польза и разница между экземпляром базового класса, использующим базовый класс, и дочерним классом в C#?


BaseClass obj1 = new BaseClass();
BaseClass obj2 = new ChildClass();

то, что делает специальное obj1 obj2 за?
если есть какой-либо сценарий, который может сделать obj2 особенным, пожалуйста, процитируйте то же самое.

Что я уже пробовал:

Я пробовал инициализировать объект обоими способами и использовать методы, параметры из него оба выглядят одинаково только для меня.

3 Ответов

Рейтинг:
2

#realJSOP

"Дочерний" класс наследует общедоступные/защищенные компоненты своего базового класса и может предоставлять дополнительные функциональные возможности с помощью своих собственных свойств и методов.

Тема наследования очень широка, и вы, вероятно, должны найти ссылку с помощью google.


Рейтинг:
0

OriginalGriff

Цитата:
то, что делает специальное obj1 obj2 за?
Ничего.
На самом деле вы можете это сделать:
BaseClass obj1 = new BaseClass();
BaseClass obj2 = new ChildClass();
obj1 = obj2;

То, что происходит, это наследование - ChildClass наследуется от BaseClass, поэтому это "базовый класс с дополнительными функциями" - каждый экземпляр является одновременно экземпляром ChildClass и экземпляром BaseClass.

Подумайте о машинах на мгновение: Ты можешь водить машину. Это означает, что вы можете ездить на Ford и Mercedes; и далее вы можете ездить на Ford Fiesta, Ford Focus, Mercedes A Class и Bugatti Veyron - вам не нужно проходить новый тест для каждого производителя или каждой модели.
"Фокус" наследует от "Форда", который наследует от "автомобиля"
"Класс а" наследует от "Мерседеса", который наследует от "автомобиля".

Поэтому все, что автомобиль может делать (StartTheEngine, DriveToTheShops) любой Форд можно сделать, и любой фокус или Фиеста также можете сделать.

Вернемся к компьютерам, и это то же самое: у вас есть базовый класс, и все производные классы могут делать все, что может база. Когда вы используете переменную, ее тип определяет то, что компилятор позволит вам сделать:
BaseClass obj1 = new BaseClass();
BaseClass obj2 = new ChildClass();
obj1.BaseClassMethod();
obj2.BaseClassMethod();
Все в полном порядке.
Но это не позволит вам использовать определенные элементы ChildClass:
obj1.ChildClassMethod();
obj2.ChildClassMethod();
Оба они выдадут вам ошибку компилятора, потому что obj1 и obj2 оба способны содержать базовый класс, что не означает, что то, что они держат, будет экземпляром дочернего класса.

Есть ли в этом хоть какой-то смысл?


Рейтинг:
0

F-ES Sitecore

Занятия

public class Cat : Animal
{
    public int NumberOfBirdsKilled { get; set; }
    public override string Speak()
    {
        return "Meow";
    }
}

public class Dog : Animal
{
    public int NumberOfButtsSniffed { get; set; }
    public override string Speak()
    {
        return "Woof";
    }
}

public class SockMaker
{
    public void MakeSocks(Animal animal)
    {
        for (int i = 1; i <= animal.NumberOfLegs; i++)
        {
            Console.WriteLine("Making sock number " + i.ToString());
        }
    }
}


Animal obj1 = new Animal();
Animal obj2 = new Cat();

// obj1 references an instance of the base class Animal and that instance only has Animal properies like NumberOfLegs or Speak()
// the obj1 variable is of base type Animal so only allows access to Animal properties like NumberOfLegs or Speak()
obj1.NumberOfLegs = 8;

// obj2 references an instance of the child class Cat and that instance has both Animal properties and Cat properties
// the obj2 variable is of base type Animal so only allows access to Animal properties like NumberOfLegs or Speak()

obj2.NumberOfLegs = 4;
// obj2.NumberOfBirdsKilled = 90001; <-- won't compile

// the above line doesn't compile because even though the object referenced by obj2 has a NumberOfBirdsKilled property
// the obj2 variable itself only knows about Animal properties and that is a Cat property, not an Animal one
// so the object referenced by the variable obj2 has properties that we can't access even though they do exist
// contrast that with obj1 where the object referenced is Animal and the reference variable is also Animal
// so we can access all possible properties of the object, nothing is blocked off

// because obj2 references a Cat object we can "up cast" it to Cat

Cat c = (Cat)obj2;

// both "c" and "obj2" reference the same object but because the "c" variable is type Cat it knows about both Cat
// and Animal properties so can access both

Console.WriteLine(c.NumberOfLegs); // this will write "4", remember there is only one Cat object that both obj2 and c reference
c.NumberOfBirdsKilled = 9001; // this property always existed on the object, but now we can access it as we are using a variable of type Cat

// why would we want to do this?  Let's say we have a class that only cares about the properties on Animal
List<Animal> animals = new List<Animal>();

animals.Add(new Cat { NumberOfLegs = 4, NumberOfBirdsKilled = 9001 });
animals.Add(new Dog { NumberOfLegs = 4, NumberOfButtsSniffed = 7 });

SockMaker sm = new SockMaker();

foreach (Animal a in animals)
{
    // "a" might reference a "Cat", might be a "Dog", the sock maker doesn't care as it is only interested
    // in the NumberOfLegs property so only needs a variable type that can access that property
    sm.MakeSocks(a);
}