本文實例講述了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#程序設計有所幫助。