2016-02-16 3 views
1

У меня есть класс, наследующий от другого; родительский класс имеет все статистические данные (представьте персональный лист RPG), в то время как у дочернего класса есть только несколько дополнительных параметров.Правильный способ вызова конструктора родительского класса из дочернего элемента

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

родительский класс:

public class genericguy 
{ 
    private string _name; 
    private int _age; 
    private string _phone; 

    public genericguy(string name) 
    { 
     this._name = name; 
     this._age = 18; 
     this._phone = "123-456-7890"; 
    } 
    // the rest of the class.... 
} 

детей класс:

public class specificguy:genericguy 
{ 
    private string _job; 
    private string _address; 

    public specificguy(string name) 
    { 
     this._name = name; 
     this._job = "unemployed"; 
     this._address = "somewhere over the rainbow"; 
     // init also the parent parameters, like age and phone 
    } 
    // the rest of the class.... 
} 

В этом примере, у меня есть класс genericguy; который имеет 3 параметра, которые устанавливаются, когда объект создается в конструкторе. Я хотел бы, чтобы в классе children, называемом «specificguy, эти параметры инициализированы, как это происходит в родительском. Как это сделать правильно? В Python вы всегда вызываете конструктор родителя ("__init__"), но я не уверен в C#

ответ

2

детей класс:

public class specificguy:genericguy 
{ 
    private string _job; 
    private string _address; 
    //call the base class constructor by using : base() 
    public specificguy(string name):base(name) //initializes name,age,phone 
    { 
     //need not initialize name as it will be initialized in parent 
     //this._name = name; 
     this._job = "unemployed"; 
     this._address = "somewhere over the rainbow"; 
    } 
} 
0

Вы можете объявить класс ребенка конструктор, как

public specificguy(string name) : base(name) 
1

Есть две части ответа:

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

В случае вашего specificguy это означает, что конструктор должен выглядеть следующим образом:

public specificguy(string name) : base(name) 
{ 
    // The line where you did "this._name = name;" need to be removed, 
    // because "base(name)" does it for you now. 
    this._job = "unemployed"; 
    this._address = "somewhere over the rainbow"; 
    // init also the parent parameters, like age and phone 
} 

В Python вы всегда вызывать конструктор родительского ("__init__")

C# автоматически вызывать конструктор no-argument для вас; в случаях, когда такой конструктор отсутствует, вы должны указать явный вызов через синтаксис : base(...).

Смежные вопросы