Наследование конструктора в C#
Я хотел заставить программу наследовать конструктор базового класса для того, чтобы я мог создавать экземпляр наследника. Я написал следующий код:
public class Human
{
private string Specie = "Homo Sapiens";
//Создали аксессор, создали поле, создали значение по умолчанию
public string name { get; set; } = "Иван";
//Возня с геттерами и сеттерами опущена
}
}
}
public class Subject:Human
{
//А вот эти поля мы скормим в конструктор
public bool isOldfag { get; set; } = false;
public bool isCool { get; set; } = false;
public Subject(bool _isOldfag, bool _isCool) : base(string _name)
{
this.isOldfag = _isOldfag;
this.isCool = _isCool;
this.name = "test";
}
Компилятор выдал сразу две ошибки:
- CS1525 Недопустимый термин "string" в выражении
- Ошибка CS0103 Имя "_name" не существует в текущем контексте.
Ума не приложу, где я допустил ошибку. Буду очень благодарен за ответ.
Ответы (2 шт):
public class Human {
public string Name;
public Human (string name) {
Name = name;
Debug.Log("Human Constructor");
}
}
public class Subject : Human {
public bool IsOldfag;
public bool IsCool;
// наследуемый обращается к родительскому через base:(string)
public Subject (bool isOldfag, bool isCool, string name) : base(name) {
IsOldfag = isOldfag;
IsCool = isCool;
Debug.Log("Subject Constructor");
}
// сам к себе обращается через this:(bool, bool, string)
public Subject (bool isOldfag, bool isCool) : this(isOldfag, isCool, "test") {
Debug.Log("Subject Constructor Short");
}
public Subject () : this(true, true, "test") {
Debug.Log("Subject Constructor No Attrubue");
}
}
Subject NewSubject = Subject(true, true);
Log:
Human Constructor
Subject Constructor
Subject Constructor Short
Ошибки компилятор выдал потому что base(...) -- это вызов конструктора базового класса, а не его определение/объявление, то есть мы как бы говорим: "прежде, чем выполнить мой конструктор, вызови ка конструктор базового класса вот с такими-то параметрами", а следовательно во-первых нам не надо объявлять тип параметра, во-вторых параметр, с которым мы вызываем конструктор базового класса должен быть в области видимости, например, быть одним из параметров конструктора наследника, а конструктор базового должен иметь соответствующую сигнатуру. Чтобы все работало достаточно поправить указанные ошибки: убрать указание типа из вызова, добавить параметр name конструктору класса Subject и добавить конструктор, который принимает строковый параметр name, базовому классу (это, кстати, в принципе, логично, у человека всегда есть имя). Тем не менее в коде есть некоторые проблемы, присущие коду новичка поэтому позволю себе привести свой вариант:
public class Human
{
// Литералы стоит объявлять константами или static readonly, если они публичны
private const string Specie = "Homo Sapiens";
// Публичные члены именуются в PascalCase
public string Name { get; set; } = "Иван";
public Human(string name)
{
Name = name;
}
}
// Двоеточие в данном случае стоит обрамить пробелами
public class Subject : Human
{
// bool по умолчанию всегда false, не надо присваивать его явно
public bool IsOldfag { get; set; }
public bool IsCool { get; set; }
// Параметры метода именуются в camelCase
public Subject(string name, bool isOldfag, bool isCool) : base(name)
{
IsOldfag = isOldfag;
IsCool = isCool;
}
}
Как-то так, если, конечно я понял всё правильно и Вы всё же говорили о цепочке конструкторов. :)