2017-04-06 32 views
1

所以我只是試圖讓我的頭圍繞這個概念在這裏:C#定義子類時基類是如何工作的?

方案1

我有一個名爲的人一個基類,它有一個不帶參數的單一constrcutor(即默認構造函數)

這個類有2分保護遺產,我可以改變(他們是公開的)

現在我想創建一個子類(稱之爲學生),有一個額外的參數,所以我可以創建3個參數的構造函數(1 + 2從基類)

如果我創建一個子類的對象,我可以在3個參數傳遞 - 沒問題這工作(這可能是錯誤的方式做到這一點,但它的作品)

方案2

我有一個基類稱爲人,現在我有一個單一的構造函數接受2個參數,我沒有沒有參數的默認構造函數。

當我現在創建子類(學生),爲其構造函數創建另一個參數。

這個構造函數只有一個參數,就像我在情景1

做不過我可以用:base()鏈接的基類,我不能從基類中添加第二個和第三個參數,但我需要通過在值與參數相反。

問題

如何我把自定義值在:base類當我創建一個學生對象。因爲當我將它鏈接到子類構造函數中時,我正在傳入值。

基類

class Person 
{ 
    protected string Name; 
    protected int Age; 

    //public Person1(){} 

    public Person(string _name, int _age) 
    { 
     Name = _name; 
     Age = _age; 
    } 

    public void SayHello() 
    { 
     Console.WriteLine("Helllo World!"); 
     Console.WriteLine($"My name is {Name} and I am {Age} years old"); 
    } 
} 

子類

class Student : Person1 
{ 
    private int StudentId; 

    //I was hoping to put in new parameters in the base() 
    public Student(int _studentId) : base ("", 00) 
    { 
     //_name and _age do not exist 
     //Name = _name; 
     //Age = _age; 
     StudentId = _studentId; 
    } 
} 

Program.cs的

static void Main(string[] args) 
    { 
     var p1 = new Person1("John", 45); 
     p1.SayHello(); 


     var student1 = new Student(123456); 
    } 

但我不知道^ h ow添加在我的基類中設置的參數

+0

編寫新的構造函數時,默認情況下編譯器不生成默認的無參數構造函數。所以除了其他構造函數外,爲了能夠調用'base()' –

+0

所以你必須編寫無參數構造函數。所以,當我創建子類的對象時,如何定製這些參數?換句話說,如果在學生課程中沒有參數,我怎樣才能給student1一個不同的名字,然後student2呢? –

+0

骯髒的方法是使用靜態字段來爲每個實例化您的數字。乾淨的方式是使用工廠模式,創建一個工廠來處理學生的初始化 –

回答

3

構造函數Student需要接受將傳遞給基礎構造函數Person的參數。

class Student : Person 
{ 
    private int StudentId; 

    public Student(string name, int age, int studentId) 
     : base(name, age) 
    { 
     StudentId = studentId; 
    } 
} 
+0

同樣映射學生姓名和年齡參數這裏的基地名稱和年齡? –

+0

將基礎構造函數看作您從子構造函數調用的方法。 'Student'構造函數*調用Person的構造函數,並根據'Person'構造函數簽名傳入兩個參數。第一個參數是一個字符串(在基礎構造函數中引用爲'_name'),第二個參數是一個整數(在基礎構造函數中引用爲「_age」。) –

+0

真棒,現在變得更有意義:-)感謝爲我澄清這一點。 –