1. 程式人生 > 其它 >C#中子類呼叫父類的構造方法

C#中子類呼叫父類的構造方法

本文例項講述了C#中實現子類呼叫父類的方法,分享給大家供大家參考之用。具體方法如下:

public class Person
{
    public Person()
    {
      Console.WriteLine("我是人");
    }
}
public class Student : Person
{
    public Student()
    {
      Console.WriteLine("我是學生");
    }
}
 

在客戶端通過子類無參建構函式建立子類例項。

class Program
{
    static void Main(string[]
args) { Student student = new Student(); Console.ReadKey(); } }
 

輸出結果:

我是人
我是學生
 

可見:通過呼叫子類無參建構函式建立子類例項,會預設呼叫父類無參建構函式。
如果把父類的無參建構函式去掉,會怎樣呢?

–結果會報"Person不包含0個引數的建構函式"錯。

二、通過子類有參建構函式建立子類例項

再同時為子類和父類新增有參建構函式。

public class Person
{
    public Person()
    {
      Console.WriteLine(
"我是人"); } public Person(string name) { Console.WriteLine("我是人,我的名字叫{0}", name); } } public class Student : Person { public Student() { Console.WriteLine("我是學生"); } public Student(string name) { Console.WriteLine("我是學生,我的名字叫{0}", name); } }
 

在客戶端通過子類有參建構函式建立子類例項。

Student student = new Student("小明");
Console.ReadKey();
 

輸出結果:輸出結果:

我是人
我是學生,我的名字叫小明
 

可見:通過呼叫子類有參建構函式,同樣預設會呼叫父類無參建構函式。

三、在子類中明確指出呼叫哪個父類建構函式

以上,預設呼叫了父類的無參建構函式,但如何呼叫父類的有參建構函式呢?

–在子類中使用base

在子類Student中的有參建構函式中使用base,明確呼叫父類有參建構函式。

public class Student : Person
{
    public Student()
    {
      Console.WriteLine("我是學生");
    }
    public Student(string name)
      : base(name)
    {
      Console.WriteLine("我是學生,我的名字叫{0}", name);
    }
}
 

客戶端

Student student = new Student("小明");
Console.ReadKey();
 

輸出結果:

我是人,我的名字叫小明
我是學生,我的名字叫小明
 

四、通過子類設定父類的公共屬性

在父類Person中增加一個Name公共屬性,並在父類的建構函式中對Name屬性賦值。

public class Person
{
    public string Name { get; set; }
    public Person()
    {
      Console.WriteLine("我是人");
    }
    public Person(string name)
    {
      this.Name = name;
      Console.WriteLine("我是人,我的名字叫{0}", name);
    }
}
 

在客戶端:

Student student = new Student("小明");
Console.WriteLine("子類獲取父類的Name屬性值為{0}", student.Name);
Console.ReadKey();
 

輸出結果:

我是人,我的名字叫小明
我是學生,我的名字叫小明 
子類獲取父類的Name屬性值為小明
 

以上程式碼的執行路徑是:

  • →呼叫子類有參建構函式,並把該引數傳值給父類有參建構函式
  • →呼叫父類有參建構函式,並給父類公共屬性Name賦值
  • →子類例項呼叫父類的公共屬性

其實,以上的做法在分層架構設計中已經得到了很好的使用。在分層架構中,通常會為所有的Repository建立一個基類,在基類中設計一個代表當前Repository的屬性,並在基類的建構函式中為該屬性賦值;最終,在建立子類Repository例項時,在為基類的、代表當前Repository的公共屬性賦值。
在子類中,當父類通過base拿到子類的引數時,還可以對該引數做一些處理,比如代表父類的base把從子類拿到的引數轉換成大寫。

public class Student : Person
{
    public Student()
    {
      Console.WriteLine("我是學生");
    }
    public Student(string name)
      : base(ConvertToUpper(name))
    {
      Console.WriteLine("我是學生,我的名字叫{0}", name);
    }
    private static string ConvertToUpper(string name)
    {
      return name.ToUpper();
    }
}
 

輸出結果:

我是人,我的名字叫DARREN
我是學生,我的名字叫darren
子類獲取父類的Name屬性值為DARREN
 

總結:
①.通過子類無參建構函式建立子類例項,會預設呼叫父類的無參建構函式
②.通過子類有參建構函式建立子類例項,也會預設呼叫父類的無參建構函式
③.在子類建構函式中通過base關鍵字指明父類建構函式,當通過子類建構函式建立例項,會呼叫指明的、父類的建構函式
④.父類的公共屬性可以通過子類來賦值,子類也可以獲取到父類的公共屬性

出處:https://blog.csdn.net/WuLex/article/details/88608458