里氏替換、抽象方法、虛方法

里氏替換原則

  • 子類的對象能夠替換其父類

  • 父類對象不能夠替換子類

  • 父類的方法都要在子類中實現或者重寫

示例:


            List<Persons> listPerson = new List<Persons>();

            listPerson.Add(s1);

            listPerson.Add(s2);

            listPerson.Add(s3);

            listPerson.Add(s4);

            listPerson.Add(t1);

            listPerson.Add(t2);

            listPerson.Add(t3);

            for (int i = 0; i < listPerson.Count; i++)

            {

                listPerson[i].SayHi();

            }

在Person類中定義了抽象方法SayHi,在Student和Teacher類中分別對SayHi進行了重寫。將他們都放到list集合中時,他們分別具有不同的類型。

監視listPerson[i]結果顯示:

  • 當i=0到3是listPerson[i]的類型是Student

  • 當i=4到6是listPerson[i]的類型是Teacher

這是一個里氏替換的例子,子類會代替父類。

虛方法和抽象方法

抽象方法

方法聲明時加上 abstract 關鍵字,包含抽象方法的類必須是抽象類,因爲抽象方法僅僅只有方法的定義(連大括號{}都沒有),它必須在子類中進行重寫,除非這個子類還是抽象類,由於有這個抽象方法的存在,這個類不能被實例化使用。因而在包含抽象方法的類前也要加上abstract關鍵字。


        //抽象方法

        public  abstract void SayHi();//後面沒有大括號,更沒有裏面的內容!
  • 僅僅是方法的定義,不能包含方法體

  • 必須在子類中重寫override

  • 只能存在於抽象類中

虛方法

方法聲明是加上了virtual關鍵字,與抽象方法不同的是,它提供了一個默認的方法體,其子類可根據自己的需要對其進行重寫。如果不重寫就會調用默認的方法。


        public virtual void SayHi()

        {

            Console.WriteLine("大家好,我是:{0},今年:{1}歲了!",Name ,Age );

        }
  • 要有方法體,僅僅一個分號也可以

  • 子類中可以重寫,也可以不重寫

  • 除了不能在密封類中,其他類中都可以

重寫 override

在子類中,如果父類中有抽象方法(abstract)或者虛方法(virtual),可以用override對其進行重寫。

示例:


        public override  void SayHi()

        {

            Console.WriteLine("同學們好,我是{0},性別{1},年齡{2},工資{3},教齡{4}。",Name ,Gender ,Age ,Salary ,YearOfService );

        }//在Teacher類中對父類Person的SayHi方法重寫

面向對象的三大特性

  • 封裝

    隱藏內部實現,穩定外部接口

  • 繼承

    子類繼承父類成員,實現代碼複用

  • 多態

    不同子類對同一消息做出不同的反映

is 和 as

is

  • is用於檢查對象是否與指定類型兼容

檢查一個對象是否兼容於其他指定的類型,並返回一個Bool值,如果一個對象是某個類型或是其父類型的話就返回爲true,否則的話就會返回爲false,永遠不會拋出異常。

如果對象引用爲null,那麼is操作符總是返回爲false,因爲沒有對象可以檢查其類型。

    if (person[i] is Student)//判斷Person集合的某元素是不是Student類型

as

  • as用於在兼容的引用類型之間指向轉換

必須是引用類型,不能是值類型。

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