Home [C# 筆記] 里氏轉換(LSP)
Post
Cancel

[C# 筆記] 里氏轉換(LSP)

里氏轉換

  1. 子類可以賦值給父類
  2. 如果父類中裝的是子類物件,那麼可以將這個父類強轉為子類物件。

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("我是女人");
    }
}

This post is licensed under CC BY 4.0 by the author.

[C# 筆記] this base new 關鍵字

[C# 筆記] Protected 受保護的