Конструктор базового класса не наследуется в C # - PullRequest
0 голосов
/ 07 сентября 2018

Конструкторы в C # не наследуются. Нужно явно вызвать конструктор базового класса. Но с другой стороны также сказано, что конструктор базового класса автоматически вызывается перед конструктором дочернего класса.

Может кто-нибудь объяснить это?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Класс может иметь много конструкторов.Если класс является подклассом другого класса, то каждый один из его конструкторов будет вызывать a конструктор своего базового класса.

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

Если я возьму код @ Ivien и немного его разверну:

public class Human
{
    public Human()
    {
        Console.WriteLine("I am human");
    }

    public Human(int i)
    {
        Console.WriteLine("I am human " + i);
    }
}
public class Man : Human
{
    public Man()
    {
        Console.WriteLine("I am man");
    }

    public Man(int i)
    {
        // The default base class constructor will be implicitly called here
        Console.WriteLine("I am man " + i);
    }
}
public class Woman : Human
{
    public Woman()
    {
        Console.WriteLine("I am woman");
    }
    public Woman(int i) : base(i)
    {
        // I don't want the default base class constructor, so I force a call to the other constructor
        Console.WriteLine("I am woman " + i);
    }
}

Вы увидите то же самоевещь, которую @Ivien видел для своего кода, но вы увидите:

I am human 2 
I am woman 2 

Если вы сделаете что-то вроде: var w2 = new Woman(2);

0 голосов
/ 07 сентября 2018

Это зависит от того, как реализован ваш конструктор, например

class Human {
    public Human() {
        Console.WriteLine("I am human");
    }

    public Human(int i) {
        Console.WriteLine("I am human " + i);
    }
}

class Man : Human {
    public Man() {
        Console.WriteLine("I am man");
    }

    public Man(int i) {
        Console.WriteLine("I am man " + i);
    }
}


static void Main(string[] args)
{
    Man m1 = new Man();

    Man m2 = new Man(2);

    Console.ReadLine();
}

Тогда результат будет:

I am human //this is m1
I am man   //this is m1
I am human //this is m2
I am man 2 //this is m2

но если вы хотите, чтобы "m2" показывалось как

I am human 2 //this is m2
I am man 2   //this is m2

вам нужно явно вызвать конструкцию базового класса

class Man : Human {
    public Man() {
        Console.WriteLine("I am man");
    }

    public Man(int i) : base(i) {
        Console.WriteLine("I am man " + i);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...