C#中子類調用父類的實現方法


這篇文章主要介紹了C#中子類調用父類的實現方法,通過實例逐步分析了類中初始化構造函數的執行順序問題,有助於加深對C#面向對象程序設計的理解,需要的朋友可以參考下
 
 

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

一、通過子類無參構造函數創建子類實例

創建父類Person和子類Student。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Person
{
public Person()
{
Console.WriteLine( "我是人" );
}
}
public class Student : Person
{
public Student()
{
Console.WriteLine( "我是學生" );
}
}

在客戶端通過子類無參構造函數創建子類實例。

 
1
2
3
4
5
6
7
8
class Program
{
static void Main( string [] args)
{
Student student = new Student();
Console.ReadKey();
}
}

輸出結果:

 
1
2
我是人
我是學生

可見:通過調用子類無參構造函數創建子類實例,會默認調用父類無參構造函數。

如果把父類的無參構造函數去掉,會怎樣呢?
--結果會報"Person不包含0個參數的構造函數"錯。

二、通過子類有參構造函數創建子類實例

再同時為子類和父類添加有參構造函數。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
}
}

在客戶端通過子類有參構造函數創建子類實例。

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

輸出結果:

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

可見:通過調用子類有參構造函數,同樣默認會調用父類無參構造函數。

三、在子類中明確指出調用哪個父類構造函數

以上,默認調用了父類的無參構造函數,但如何調用父類的有參構造函數呢?
--在子類中使用base

在子類Student中的有參構造函數中使用base,明確調用父類有參構造函數。

 
1
2
3
4
5
6
7
8
9
10
11
12
public class Student : Person
{
public Student()
{
Console.WriteLine( "我是學生" );
}
public Student( string name)
: base (name)
{
Console.WriteLine( "我是學生,我的名字叫{0}" , name);
}
}

客戶端

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

輸出結果:

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

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

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

 
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Person
{
public string Name { get ; set ; }
public Person()
{
Console.WriteLine( "我是人" );
}
public Person( string name)
{
this .Name = name;
Console.WriteLine( "我是人,我的名字叫{0}" , name);
}
}

在客戶端:

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

輸出結果:

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

以上代碼的執行路徑是:

→調用子類有參構造函數,並把該參數傳值給父類有參構造函數
→調用父類有參構造函數,並給父類公共屬性Name賦值
→子類實例調用父類的公共屬性

其實,以上的做法在分層架構設計中已經得到了很好的使用。在分層架構中,通常會為所有的Repository創建一個基類,在基類中設計一個代表當前Repository的屬性,並在基類的構造函數中為該屬性賦值;最終,在創建子類Repository實例時,在為基類的、代表當前Repository的公共屬性賦值。

在子類中,當父類通過base拿到子類的參數時,還可以對該參數做一些處理,比如代表父類的base把從子類拿到的參數轉換成大寫。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
}
}

輸出結果:

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

總結:

①.通過子類無參構造函數創建子類實例,會默認調用父類的無參構造函數
②.通過子類有參構造函數創建子類實例,也會默認調用父類的無參構造函數
③.在子類構造函數中通過base關鍵字指明父類構造函數,當通過子類構造函數創建實例,會調用指明的、父類的構造函數
④.父類的公共屬性可以通過子類來賦值,子類也可以獲取到父類的公共屬性

相信通過本文上述實例的分析,可以加深大家對C#類的初始化與繼承的理解。希望本文所述對大家進一步的學習C#程序設計有所幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM