C#學習筆記14-里氏轉換

里氏轉換

里氏轉換原則(Liskov Substitution Principle,LSP)面向對象設計的基本原則之一。 里氏轉換原則中說,任何父類可以出現的地方,子類一定可以出現。

里氏轉換,實質上就是類型的轉換,在學C#過程中,我們一定經歷過類型轉換,如將int轉換爲double等,那麼里氏轉換,就是實現類中的類型轉換,從而實現設計的封閉性。

里氏轉換原則

1)子類可以賦值給父類
如果有一個地方需要用父類作爲參數,我們可以用一個子類代替
如:C#學習筆記11-繼承的基本概念中提到的父類Person,子類StudentInfo、TeacherInfo等,那麼在創建對象過程中,可以用子類來代替

Person p=new StudentInfo();

2)如果父類中裝的是子類,那麼可以將這個父類強轉爲子類

 Person p2 = new Student()Student s1 = (Student)p2;

子類對象可以調用父類的成員,但是父類對象不可以調用子類的成員

里氏轉換中的is 和 as

is關鍵字

is表示類型轉換,如果能夠轉換成功,返回一個true,否則返回false

            Student s = new Student();
            Person p = s;//子類可以賦值給父類
            if(p is Teacher)
            {
                Teacher s3 = (Teacher)p2;
            }
            else
            {
                Console.WriteLine("轉換失敗");
            }

as關鍵字

as表明類型轉換,如果能夠轉換,則返回對應對象,否則返回null

  Person p2 = new Teacher();//子類賦值給父類
  Teacher s4 = p2 as Teacher;

里氏轉換實例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _02里氏轉換練習
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
             * 隨機輸出我是野獸、人類、學生、老師、帥鍋、美女
             */
            Person[] p1 = new Person[10];//子類可以賦值給父類,所以可以都歸爲Person
            Random r = new Random();
            //爲數組賦值
            for (int i = 0; i < p1.Length; i++)
            {
                int rNumber = r.Next(1, 7);
                switch (rNumber)
                {
                    case 1:
                        p1[i] = new Student();
                        break;
                    case 2:
                        p1[i] = new Teacher();
                        break;
                    case 3:
                        p1[i] = new ShuaiGuo();
                        break;
                    case 4:
                        p1[i] = new MeiLv();
                        break;
                    case 5:
                        p1[i] = new Animal();
                        break;
                    default:
                        p1[i] = new Person();
                        break;
                }
            }
            //父類不能調用子類的成員,所以需要進行強制轉換
            for (int i = 0; i < p1.Length; i++)
            {
                if(p1[i] is Student)
                {
                    ((Student)p1[i]).StudentSayHello();
                }
                else if(p1[i] is Teacher)
                {
                    ((Teacher)p1[i]).TeacherSayHello();
                }
                else if(p1[i] is ShuaiGuo)
                {
                    ((ShuaiGuo)p1[i]).ShuaiGuoSayHello();
                }
                else if(p1[i] is MeiLv)
                {
                    ((MeiLv)p1[i]).MeiLvSayHello();
                }
                else if(p1[i] is Animal)
                {
                    ((Animal)p1[i]).AnimaSayHello();
                }
                else
                {
                    p1[i].SayHello();
                }
            }
            Console.ReadKey();
        }
        public class Person
        {
            int _age;

            public int Age { get => _age; set => _age = value; }

            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 ShuaiGuo : Person
        {
            public void ShuaiGuoSayHello()
            {
                Console.WriteLine("我是帥鍋");
            }
        }
        public class MeiLv : Person
        {
            public void MeiLvSayHello()
            {
                Console.WriteLine("我是美鋁");
            }
        }
        public class Animal : Person
        {
            public void AnimaSayHello()
            {
                Console.WriteLine("我是野獸");
            }
        }
    }
}

:後面的多態可以更加簡單的實現該功能,敬請期待哦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章