里氏轉換
- 子類可以賦值給父類
- 如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。
1.子類可以賦值給父類
1
2
| Student s = new Student();
Person p = s;
|
所以也可以這樣寫:
1
| Person p = new Student();
|
例如:string.Join 也是 子類 賦值給父類的
1
| string str = string.Join("|", new string[] { "1", "2", "3", "4", "5" });
|
2.如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。
1
2
3
| Person p = new Student();
Student s = (Student)p; //父類強轉為子類物件
//Teacher t = (Teacher)p; //執行會報錯,因為父類裝的是student
|
is as 類型轉換
- is:表示類型轉換,轉換成功true,失敗false
- as:表示類型轉換
is 的用法
is 會用在判斷,轉換成功回傳 true, 失敗false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Person p = new Student(); //父類Person裝子類Student物件
//轉換失敗,因為p裝的是Student
if (p is Teacher) {
Teacher t = (Teacher)p;
t.TeacherSayHello();
} else {
Console.WriteLine("轉換失敗");
}
//轉換成功,因為p裝的是Student
if (p is Student) {
Student student = (Student)p;
student.StudentSayHello();
} else {
Console.WriteLine("轉換失敗");
}
|
as 的用法
as 如果能轉換,則返回一個「對應的物件」,否則回傳null
1
2
| Student? s = p as Student; //轉換成功,返回Student物件
s.StudentSayHello();
|
1
| Teacher? t = p as Teacher; //null,因為p裝的是Student
|
練習:創建10個物件,通過一個迴圈,去調用他們各自打招呼的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
| Person[] persons = new Person[10]; //宣告父類陣列
Random rnd = new Random(); //宣告產生隨機數物件
//for循環目的:通過隨機數去給每個陣列賦值(子類的物件)
for (int i = 0; i < persons.Length; i++)
{
int num = rnd.Next(1, 6); //產生隨機數1-5的數字
switch (num)//1-5
{
case 1:
persons[i] = new Student(); //子類可以賦值給父類
break;
case 2:
persons[i] = new Teacher();
break;
case 3:
persons[i] = new Men();
break;
case 4:
persons[i] = new Women();
break;
case 5:
persons[i] = new Person();
break;
}
}
//調用每個元素打招呼
for (int i = 0; i < persons.Length; i++)
{
//如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。
if (persons[i] is Student) //如果父類可以轉換Student成功
{
((Student)persons[i]).StudentSayHello(); //調用Student的方法
} else if (persons[i] is Teacher)
{
((Teacher)persons[i]).TeacherSayHello();
} else if (persons[i] is Men)
{
((Men)persons[i]).MenSayHello();
} else if (persons[i] is Women)
{
((Women)persons[i]).WomenSayHello();
} else
{
persons[i].SayHello(); //調用Person自己的方法
}
}
Console.ReadKey();
//父類
public class Person
{
public void SayHello()
{
Console.WriteLine("我是人類");
}
}
//子類
public class Student : Person
{
public void StudentSayHello()
{
Console.WriteLine("我是學生");
}
}
public class Teacher : Person
{
public void TeacherSayHello()
{
Console.WriteLine("我是老師");
}
}
public class Men : Person
{
public void MenSayHello()
{
Console.WriteLine("我是男人");
}
}
public class Women : Person
{
public void WomenSayHello()
{
Console.WriteLine("我是女人");
}
}
|