Создает ли экземпляр дочернего класса экземпляр родительского класса?

Я новичок в С#, и я хотел знать, что если я создам экземпляр дочернего класса, он также автоматически создаст экземпляр родительского класса или что?

Вот мой код:

class Program
{

    public class ParentClass
    {
        public ParentClass()
        {
            Console.WriteLine("ChildClass uses my Ctor ");
        }

    }

    public class ChildClass : ParentClass
    {
        public ChildClass()
        {
            Console.WriteLine("SaySomething");
        }
    }

    public static void Main()
    {
        ChildClass child = new ChildClass();
    }
}

Ответ 1

он также автоматически создает экземпляр класса Parent?

Не отдельный экземпляр; ChildClass является экземпляром ParentClass, когда речь идет о наследовании.

На словах это похоже на:

при создании собаки мы также создаем экземпляр животного?

Мы не создаем собаку и (отдельно) создаем животное; собака является экземпляром животного. И если мы создаем пуделя, пудель - это собака и является животным.

Ответ 2

Нет, это не так, но он вызывает базовый конструктор (конструктор родительского класса). Что в вашем случае пустое, поэтому вызов конструктора базового класса выполняется для вас компилятором:

class Program
{
    public class ParentClass
    {
        public ParentClass()
        {
            Console.WriteLine("ChildClass drived from me ");
        }

    }

    public class ChildClass : ParentClass
    {
        public ChildClass() : base() // base() call is voluntary
        {
            Console.WriteLine("This also use my Ctor");
        }
    }

    public static void Main()
    {
        ChildClass child = new ChildClass();
    }
}

Однако, если ваш базовый класс не имеет конструктора без параметров, вам придется его вызвать

class Program
{
    public class ParentClass
    {
        public ParentClass(string foo)
        {
            Console.WriteLine("ChildClass drived from me ");
        }

    }

    public class ChildClass : ParentClass
    {
        public ChildClass() : base("some foo") // base call is obligatory
        {
            Console.WriteLine("This also use my Ctor");
        }
    }

    public static void Main()
    {
        ChildClass child = new ChildClass();
    }
}

По определению, когда ChildClass наследует форму ParentClass, объекты ChildClass принадлежат ParentClass.

Если ваше именование было более ориентированным на реальность, было бы легче понять.

class Animal {}
class Cat : Animal {}

var rocky = new Cat();

Смотрите, каменистый кошка, но это животное, а также.

Ответ 3

Фактический ответ на ваш вопрос:

"Нет", это пример класса "Дети", а не "Родитель".

Но если ваш вопрос: "Будет ли у вас экземпляр-объект, содержащий все свойства класса" Родитель ", ответ будет

"Да", у вас будут все свойства и поля, которые у вас есть в классе родителя, скопированном в экземпляр Child.

Ответ 4

Говоря конкретно о вашем коде:

class Program
{

    public class ParentClass
    {
        public ParentClass()
        {
            Console.WriteLine("ParentClass constructor is called");
        }

    }

    public class ChildClass : ParentClass
    {
        public ChildClass()
        {
            Console.WriteLine("ChildClassConstructor is called");
        }
    }

    public static void Main()
    {
        //will print that the Parent ctor is called, followed by printing that the child ctor is called
        ChildClass child = new ChildClass();

        //will print that the Parent ctor is called, followed by printing that the child ctor is called
        ParentClass childinparentbox = new ChildClass();

        //will print that the Parent ctor is called
        ParentClass parent = new ParentClass();

        //At this point there are 3 object instances in memory


        //by the way, this can't be done. Can't store a parent in a child: a parent is-not-a child
        ChildClass parentinchildbox = new ParentClass();


    }
}

Я изменил сообщения, чтобы сделать их релевантными для точки:

Конструктор - это просто метод, который принудительно называется всякий раз, когда создается новый объект. Вы используете его для установки нового объекта для использования, инициализации свойств и т.д. Классы иерархичны в С# - все всегда является подклассом чего-то, иногда Object. Ваш parentClass является дочерним объектом Object, он просто не говорит. Ваш ребенок объявлен ребенком родителя

Как отмечали другие, вы не получаете несколько экземпляров объектов, когда используете new, вы получаете один экземпляр того, что вы просили создать. Дочерние классы всегда могут ссылаться на/"храниться внутри" на переменную, объявленную как родительский тип. Это потому, что у вещей есть отношения "есть-а" в направлении Ребенка → Родитель. Собака - это животное, кошка - это животное, животное - это объект. У них нет отношений в обратном направлении. Вы не можете сказать, что автомобиль - это Ferrari, или какое-то животное - собака.

Итак, все преследует резервную копию иерархии, и вы можете хранить Кошку или Собака внутри переменной, объявленной для хранения Animal. У животных может быть метод GetNumberOfLegs(), который сообщает количество ног. Кошка и собака вернутся 4, обезьяна вернется 2.

Одним из ключевых принципов объектно-ориентированного программирования является то, что вы можете ссылаться на вещи общим образом; у всех животных есть несколько ног. Если это кошка/собака, хранящаяся в Animal, то GetNumberOfLegs() возвращает 4, если она обезьяна возвращает 2.. Но вам не обязательно знать это кошка, собака, обезьяна, если все, что вас интересует, это количество ног. Это будет рассмотрено больше на предстоящих лекциях, поэтому мне не нужно слишком углубляться в него здесь. Я вложил эту деталь в объяснение, почему мы могли бы даже хотеть иметь иерархию, иметь Животное, создать Собака и хранить ее внутри переменной типа Animal. Мы делаем это, потому что часто мы хотим ссылаться на вещи в общем виде, потому что нас не интересуют специфические особенности; мы определяем общие вещи, о которых мы заботимся, и конкретные вещи подходят для формы. Вы можете управлять автомобилем; вам не нужно специально обучать тому, как управлять Ford или Chevrolet - у них есть рулевое колесо и педали в том же месте/расположении. Вы можете управлять общим интерфейсом. Вам все равно, как рулевое управление реализовано - гидравлическое, зубчатое колесо и шестерня, рука Питмана - вам просто все равно, что когда вы поворачиваете колесо "вот так", автомобиль идет "вот так".

Возвращаясь к тому, что вы спросили:

Поскольку Child is-Parent is-Object, когда вы создаете нового ребенка, вы увидите распечатку, указывающую, что родительский конструктор был вызван, и вызывается другой, указывающий, что дочерний конструктор был вызван. Это не указывает на то, что в памяти компьютера созданы 2 объекта - конструкторы вызываются в порядке вперед (от корня до конца) для всего, что находится в иерархии, начиная с Object, затем Parent, затем Child. Это так, потому что самое первое в любом коде конструктора - вызов соответствующего родительского конструктора. Первое, что содержится в этом коде конструктора, - это вызов его родительской

Таким образом, время запуска начинается у Ребенка, затем идет к родителям, прародителям, прадедушкам, вплоть до верхушки родословной, затем возвращается, выполняя остальную часть кода в каждом конструкторе по порядку, сверху вниз, Вот почему вы видите распечатку, которую вызывал конструктор родителя, тогда вы видите ребенка

Это все один и тот же объект, он вызывает несколько вызовов. Просмотр двух распечаток не указывает на два объекта в памяти, это один объект с двумя методами (два метода конструктора), которые были вызваны в рекурсивном порядке

Ответ 5

Другой способ думать о классе - это просто шаблон для объектов. т.е. экземпляры объектов, созданные из этого класса, должны иметь эту логику реализации. Создавая экземпляр класса, берет всю эту логику и преобразует ее в поведение для объекта. Когда вы наследуете какой-то класс, вы в основном включаете логику реализации родительского класса в шаблон дочернего класса, поэтому вы просто получаете расширенный "шаблон". Когда вы создаете экземпляр объекта из этого шаблона, экземпляр использует дочерний шаблон, который содержит комбинацию логики, определенной в родительском и дочернем классах.

Обычное создание экземпляра: логика класса → шаблон → экземпляр

Наследование: логика родительского класса + логика дочернего класса → шаблон → экземпляр

Ответ 6

Нет, это создаст только инстинкт дочернего класса.

Ответ 7

Cappucino вас есть Coffee родительского класса и Cappucino детского класса

class Coffee {}

class Cappucino : Coffee {}

с помощью new Cappucino() создается экземпляр для Cappucino. Капучино на самом деле является кофе, а свойства кофе унаследованы от капучино.

Для Coffee не создается отдельный экземпляр.

Капучино несет в себе свойства кофе по наследству