C#深入理解多態


1.里氏替換原則

1.里氏替換原則:在一個軟件系統中,如果子類出現在父類出現的位置,而整個軟件功能又沒有影響,那么咱們稱為里氏替換。

2.

考試題:父類變量指向子類對象!!

3.里氏替換       設計原則的一種

 七種設計原則   ,寫成blogs

4.Is as  

Is 做類型判定,  要想進行父類對象    到子類  類型的轉換,還得用 as

 2.目前學過的兩種多態

第一種:虛方法實現多態

第二種:抽象方法實現多態

實現面向對象的多態性有哪幾種方法?

   總共有3種,第一種,虛方法實現多態,  第二種:抽象方法實現多態  第三種:接口實現多態

 

抽象類可以被繼承嗎?

  可以,不僅可以被普通類繼承,也可以被抽象類繼承

3,抽象方法可以有方法體嗎?

  不可以,連花括號都不能有

3.抽象類和抽象方法

    1.定義一個抽象類,abstract 修飾

   2.抽象方法不能有方法體,甚至連{}都不能有

   3.抽象方法只能存在於抽象類中,但是抽象類中可以有非抽象方法

  4.抽象類不能實例化

  5.抽象類中抽象方法只是用來規定方法的形式(參數,返回值),約束子類方法的形式

  6.抽象類中的抽象成員必須在子類中全部實現,除非子類也是抽象類

   7.子類實現抽象方法的快捷鍵,Ctrl+.(沒有輸入法情況下 )

 

6.用虛方法實現多態的步驟

 

子類重寫父類的虛方法

 

兩種方式

 

創建父類變量,實例化子類對象

 

把父類類型作為參數類型,該子類及子類對象作為參數傳入

 

運行時,根據實際創建的對象決定執行哪個方法

 

7.什么是抽象類?

 

專業人士解析;如果在一個類前加上了abstract關鍵字,那么該類就稱為抽象類

 

8.快速在子類中生成所有的抽象方法

 

方式一:在有輸入法的情況下,使用Alt+Shift+F10

 

方式二;在無任何輸入法的情況下,使用Ctrl+.

 

    注意事項:01.必須無輸入法狀態

 

         02.不能點擊小鍵盤的點

 

9.如果一個類用sealed關鍵字修飾,那么該類就是密封類

 

   特性:密封類不能被繼承

 

10.如果以類用static修飾,那么該類就是靜態類,在靜態類中所有成員(成員變量和成員方法)都必須是靜態的額

 

 public static class SqlHelper

 

    {

 

 

 

        public static string name;

 

        public static void Say()

 

        {

 

        }

 

    }

 

注意點:

 

01.在靜態方法中不能直接訪問非靜態的方法或者變量

 

如果要在靜態方法中,訪問非靜態成員,那么要通過對象名.方法名訪問。

 

11.面向接口編程

。。。

接口是一種比抽象類更加抽象的"類"
(這里為什么會用類,但是加了引用,是因為接口本身不直接是類,在底層編譯時會由JVM轉換成抽象類)
但是要明確:接口本身就不是類.
接口是用來定義類和之間的協議,它所提供的是一種形式而沒有具體實現.
(接口中在jdk8之前是沒有方法體的jdk8可以使用default關鍵字修飾方法)
同時如果有類實現了接口那么必須實現接口中沒有實現方法.實現通過關鍵字implements
interface. --外貌他的實現類代表如何工作.

4.抽象方法和虛方法的區別

 

虛方法:

 

1、virtual方法表示此方法可以被重寫, 也就是說這個方法具有多態.父類中的方法是通用方法,可以在子類中重寫以重新規定方法邏輯. 
2、virtual方法可以直接使用,和普通方法一樣 
3、不是必須重寫的. 子類可以使用base.方法 的方式調用, 無論有沒有在子類使用override(重寫關鍵字)去重寫

 

virtual關鍵字只是明確標示此方法可以被重寫, 其實它和一般的方法沒有什么區別 
相應的 
sealed關鍵字標示此方法不可以被重寫,因為是密封類

虛方法和抽象方法的區別:

1.虛方法可以有實現體,抽象方法不能有實現體。

 

2.抽象方法
    要求派生類必須重載這個方法;

3.抽象方法必須放在抽象類中聲明;

 

虛方法
    告訴編譯器,這個方法可以重寫。
    當基類的方法與派生類的方法重名時,
    可以選擇派生類的方法從基類繼承並重寫,
    還是,把基類的方法隱藏起來(使用.base)。

 

虛方法與抽象方法的使用(當多個子類繼承同一個基類時):

 

     若基類的中的方法在子類中實現同樣的功能則使用虛方法,只要在基類中寫一個虛方法的實現就可以了,然后在子類中調用,方便操作;

 

     若子類調用基類的方法實現不同的功能的時候則用抽象類,因為抽象類的方法的實現必須在子類中實現,在子類中寫實現就可控度更高。

5. 面向對象的四大特性

封裝:保證對象自身數據的完整性和安全性。

繼承:建立類之間的關系。

多態:相同的方法調用可實現不同的實現方式。

抽象:

抽象是人們認識事物的常用方法,比如地圖的繪制。抽象的過程就是如何簡化、概括所觀察到的現實世界,並為人們所用的過程。
抽象是軟件開發的基礎。軟件開發離不開現實環境,但需要對信息細節進行提煉、抽象,找到事物的本質和重要屬性。
抽象包括兩個方面:過程抽象和數據抽象。過程抽象把一個系統按功能划分成若干個子系統,進行"自頂向下逐步求精"的程序設計。數據抽象以數據為中心,把數據類型和施加在該類型對象上的操作作為一個整體(對象)來進行描述,形成抽象數據類型ADT。
所有編程語言的最終目的都是提供一種"抽象"方法。一種較有爭議的說法是:解決問題的復雜程度直接取決於抽象的種類及質量。其中,"種類"是指准備對什么進行"抽象"。匯編語言是對基礎機器的少量抽象。后來的許多"命令式"語言(如FORTRAN、BASIC和C)是對匯編語言的一種抽象。與匯編語言相比,這些語言已有了較大的進步,但它們的抽象原理依然要求程序設計者着重考慮計算機的結構,而非考慮問題本身的結構。在機器模型(位於"方案空間")與實際解決的問題模型(位於"問題空間")之間,程序員必須建立起一種聯系。這個過程要求人們付出較大的精力,而且由於它脫離了編程語言本身的范圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。由此造成的副作用便是一門完善的"編程方法"學科。
為機器建模的另一個方法是為要解決的問題制作模型。對一些早期語言來說,如LISP和APL,它們的做法是"從不同的角度觀察世界"、"所有問題都歸納為列表"或"所有問題都歸納為算法"。PROLOG則將所有問題都歸納為決策鏈。對於這些語言,可以認為它們一部分是面向基於"強制"的編程,另一部分則是專為處理圖形符號設計的。每種方法都有自己特殊的用途,適合解決某一類的問題。但只要超出了它們力所能及的范圍,就會顯得非常笨拙。
面向對象的程序設計在此基礎上則跨出了一大步,程序員可利用一些工具來表達問題空間內的元素。由於這種表達非常普遍,所以不必受限於特定類型的問題。人們將問題空間中的元素以及它們在方案空間的表示物稱作"對象"。當然,還有一些在問題空間沒有對應體的其他對象。通過添加新的對象類型,程序可進行靈活的調整,以便與特定的問題配合。所以在閱讀方案的描述代碼時,會讀到對問題進行表達的話語。與以前的方法相比,這無疑是一種更加靈活、更加強大的語言抽象方法。
總之,OOP允許人們根據問題,而不是根據方案來描述問題。然而,仍有一個聯系途徑回到計算機。每個對象都類似一台小計算機;它們有自己的狀態,而且可要求它們進行特定的操作。與現實世界的"對象"或者"物體"相比,編程"對象"與它們也存在共通的地方:它們都有自己的特征和行為。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM