C#封裝繼承

来源:https://www.cnblogs.com/yijieyufu/archive/2019/11/30/11963833.html

面向對象開發有三大特性(特點 / 特征) : 封裝, 繼承, 多態。我們今天主要討論封裝和繼承,多態會在下篇中討論。 一、封裝: 所謂封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。封裝是面向對象的特征之一,是對象和類概念的主要特性 ...


面向對象開發有三大特性(特點 / 特征) : 封裝, 繼承, 多態。我們今天主要討論封裝和繼承,多態會在下篇中討論。

一、封裝:

所謂封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。封裝是面向對象的特征之一,是對象和類概念的主要特性。簡單的說,一個類就是一個封裝了數據以及操作這些數據的代碼的邏輯實體。在一個對象內部,某些代碼或某些數據可以是私有的,不能被外界訪問。通過這種方式,對象對內部數據提供了不同級別的保護,以防止程式中無關的部分意外的改變或錯誤的使用了對象的私有部分。

1.1、封裝五種訪問修飾符

A.public [公開訪問]

公開的訪問許可權。

當前類, 子類, 實例對象, 都可以訪問到。

B.private [私有訪問]

私有的訪問許可權。

只能在當前類內部進行訪問使用; 子類, 實例對象, 都訪問不到。

C.protected [保護訪問]

受保護的訪問許可權。

只能在當前類的內部,以及該類的子類中訪問;實例對象訪問不到。

也就是說受保護的,不讓外部的實例去訪問和改變。

D.internal [內部訪問]

只能在當前程式集(項目)中訪問;

(程式集可以理解為一個項目,一個項目也就是一個程式集。從設計的角度來說,也可以看成是一個完整的模塊(Module),或者稱為是包(Package)。因此,一個程式集也可以體現為一個dll文件,或者exe文件。一個解決方案下可以用很多項目,項目名和命名空間名可以分別設置,但預設情況下是一致的,而對應到項目的具體文件夾就是“項目的命名空間.文件夾名

在同一個項目中 internal 和 public 的訪問許可權是一樣的。

一個解決方案裡面,可以有多個項目!

E.protected internal [內部保護訪問]

protected + internal 的訪問許可權。

用的不多,我是沒用過的。

1.2、使用場合

A.修飾類

能夠修飾類的訪問修飾符只有兩個, public 和 internal;

類的預設訪問修飾符是 internal。預設類就是那種前面沒有修飾符的class

B.修飾類成員

五種訪問修飾符都可以修飾類中的成員;

類中的成員預設訪問修飾符是 private。

C.類視圖

當前項目上右鍵-->視圖-->查看類圖

可以看到類的繼承關係圖, 以及類中的成員概況。

各位留意一下欄位,屬性,方法各自特有的圖標。

欄位是小磚塊,還上鎖了。屬性是小扳手。方法是空的小盒子。

下麵是類視圖。 

 

 

 

 

二、繼承:

  將一堆類中的一些共有的“成員”單獨抽取出來,作為一個父類,然後這一堆類繼承這個父類,共用父類的資源, 這就叫做繼承。

  以為人為例,我們每個人都會有一些共同的特征,都要做一些相同的事情。比如:人都有一個腦袋,二只胳膊,二條腳,這是共同的特征。都要吃飯,喝水,這是都要做的相同的事情。那麼如果我們現在要聲明很多個人,每個人都會有這些特征,那我不是要寫很多重覆的代碼?所以我們可以先建一個人的父類,這個父類不代表一個具體的人,只是一個擁有人所有共同特性的虛擬的人。下次我 們要實例化一個具體的人的時候,只需要將這個人繼承上面這個“虛擬的人”,那麼他就擁有了人的所有共同特性。這樣,這些重覆的代碼我們就可以不寫了。

  當然,繼承的目標不僅僅是為了節省代碼,還有實現後面的多態的功能。初學者只需要瞭解繼承可以少寫很多代碼就好了,餘下的需要在項目中慢慢理解。

書面的解釋如下:對象的繼承代表一種"is-a"的關係,假如兩個對象A和B,如果可以描述為"B就是A",那麼則表示B可以繼承自A。

註意: 如果A繼承了B,那麼A不僅擁有了B除私有的特性外的所有特性,A還可以擁有自己獨特的特性。比如上面人的這個例子,一個繼承了 “虛擬的人”,那麼他除了有一個腦袋,二只胳膊,二條腳,要吃飯喝水外,他可能還會編程。編程就是他獨特的特性了,因為不是每個人都會編程的。

2.1、繼承的好處

①優化代碼結構, 讓類與類之間產生關係(人不是孤立存在的, 類也一樣);

②提高代碼的復用性, 便於閱讀(寫更少的代碼, 乾更多的活);

③為“ 多態” 提供前提(多態是面向對象最複雜的一個特性, 後面重點講解)。

2.2、生活中的例子

以電視劇舉例, 見圖。

 

 

 

2.3、方法

(1)、延續:父類存在,子類沒有重寫但可以使用;

(2)、新增:父類沒有,子類新增加的

(3)、重寫:父類子類都存在,但是父類不滿足要求,子類對其進行從新定義;

2.4、實例化:

(1)、先父類後子類,先靜態後成員;

實例化的時候先調用父類的靜態構造快,在調用父類的構造方法,然後子類的構造塊,在調用子類的構造方法;

(有繼承關係的幾個類中,構造函數是由上至下調用的,即首先調用基類的構造函數。父親會的,兒子也會,不先把父親弄出來,兒子何來會?

(2)、預設調用父類空構造;

(3)、那麼子類如何繼承父類的構造方法呢,要按如下寫法

編寫父類的構造方法

演示: 在 Hero 類中創建構造方法, 用於初始化父類中的成員。

public Hero(string m_heroName, string m_heroInfo, int m_attack, int m_defense, int m_speed, string m_nickName)
        {
            this.heroName = m_heroName;

            this.heroInfo = m_heroInfo;

            this.attack = m_attack;

            this.defense = m_defense;

            this.speed = m_speed;

            this.nickName = m_nickName;
        }

編寫子類的構造方法

演示: 在各個子類中編寫各自的構造方法, 使用 base 關鍵字傳值給父類。

關鍵字 base,代表父類;

關鍵字 this,代表當前類。

public LuKaShi() { }

        public LuKaShi(string m_heroName, string m_heroInfo, int m_attack, int m_defense, int m_speed, string m_nickName)

            : base(m_heroName, m_heroInfo, m_attack, m_defense, m_speed, m_nickName)

        {

        }

這裡他不做任何處理,直接扔給父類。

(4)、繼承之成員繼承:構造方法

構造方法可以使用 private 和 public 進行修飾。但 99%的時候使用 public 修飾, 只有在使用單例模式的時候才使用 private 修飾。

private 修飾的構造方法, 我們在子類中訪問不到;

public 修飾的構造方法, 我們在子類中可以訪問到, 使用 base()。

 

2.5、繼承的堆棧關係

 

 

父類在記憶體是實際存在的。

2.6、重寫override

2.6.1 重寫與重載:

重寫override:繼承的子類中,方法簽名相同( 方法名+形參個數 類型 順序  )

重載overload:同一個類方法名相同,形參個數 類型 順序 不同(只要有一項不同,即可構成重載)

2.6.2 重寫規則:在子類中簽名與父類中相同,在合理範圍內提高子類可見性;

這裡沒總結好,先學再總結下

A、父類必須有公共(public)或受保護(protected)的虛方法(virtual);

返回類型:基本類型和void必須相同;引用類型要<=父類的返回類

在派生類里使用override關鍵字來重寫父類的虛方法。

B、抽象方法,介面,標記為virtual的方法可以被重寫(override),實方法不可以。

C、可見性:要大於或等於父類中被重寫的方法(重寫方法的訪問修飾符一定要大於被重寫方法的訪問修飾符(public>protected>default>private))

D、重寫和覆蓋的區別

 


您的分享是我們最大的動力!

更多相關文章
  • 01 運算符重載的需求 C++ 預定義的運算符,只能用於基本數據類型的運算:整型、實型、字元型、邏輯型等等,且不能用於對象的運算。但是我們有時候又很需要在對象之間能用運算符,那麼這時我們就要 重載運算符 ,使得運算符能用於對象之間的運算。 比如,在數學上,兩個複數可以直接進行+、 等運算,但在C++ ...
  • 本系列將和大家分享下ASP.NET Core Web 應用程式的一些基礎知識,本章主要簡單介紹下在ASP.NET Core中如何使用AutoMapper進行實體映射。 ...
  • 作為開發人員,您始終需要處理應用程式配置數據。常見的示例是INI 文件,XML文件, .NET配置文件(也稱為“ .config”),Windows註冊表和命令行(argv)參數。配置文件的優點是它們載入速度快,不占用大量空間且易於編輯。Nini是一個功能強大的 .NET配置庫,旨在幫助快速構建高度... ...
  • 探究 C 中的 char 、 string(一) [TOC] 1. System.Char 字元 char 是 System.Char 的別名。 System.Char 占兩個位元組,16個二進位位。 System.Char 用來表示、存儲一個 Unicode 字元。 System.Char 的表示範 ...
  • 今天介紹一個開源的C# WPF開源控制項庫,非常漂亮,重點是開源哦 WPF做桌面開發是很有優勢的,除了微軟自帶的控制項外,還有很多第三方的控制項庫,比如收費的Dev Express For WPF、Telerik For WPF等,及Github上開源免費的控制項庫如MaterialDesignInXAML ...
  • Mark Zhou寫了很不錯的一系列介紹C# 7的文章,雖然是2年多年前發佈的,不過對於不熟悉C# 7特性的同學來說,仍然有很高的閱讀價值。 原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/26/c-7-series-part-1-value-t ...
  • 配置 在 Startup.ConfigureServices 方法中,創建具有 AddAuthentication 和 AddCookie 方法的身份驗證中間件服務: AuthenticationScheme 傳遞到 AddAuthentication 設置應用程式的預設身份驗證方案。 如果有多個 ...
  • abp攔截器基本定義 攔截器介面定義: 預設抽象類定義: abp的攔截器實現是基於Autofac.Extras.DynamicProxy,這個包依賴兩個組件:Autofac、Castle.Core(實質上是調用內部組件DynamicProxy實現動態代理)。關於此組件的資料參考 ".NET 通過 A ...
一周排行
  • 微信公眾號: "Dotnet9" ,網站: "Dotnet9" ,問題或建議: "請網站留言" , 如果對您有所幫助: "歡迎贊賞" 。 .NET CORE(C ) WPF 抽屜式菜單 閱讀導航 1. 本文背景 2. 代碼實現 3. 本文參考 4. 源碼 1. 本文背景 使用簡單動畫實現抽屜式菜單 ...
  • 在上面abp(net core)+easyui+efcore實現倉儲管理系統——ABP WebAPI與EasyUI結合增刪改查之八(三十四) 文章的學習之後。我們通過前面的八篇文章已經學習了通過WebAPI介面與控制器去實現新增、刪除與修改功能。接下來,我們要在控制器中實現查詢功能。 ...
  • 1.選中項目-->屬性-->生成-->選中 XML文檔文件(xml路徑和該項目相同) 2.選擇生成序列化程式集:自動/開 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,記錄一下學習過程以備後續查用。 一、引言 從今天開始我們開始講結構型設計模式,結構型設計模式有如下幾種:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。 創建型設 ...
  • C 中 ConfigureAwait 相關答疑FAQ 在前段時間經常看到園子里有一些文章討論到 ConfigureAwait,剛好今天在微軟官方博客看到了 "Stephen Toub" 前不久的一篇答疑 ConfigureAwait 的一篇文章,想翻譯過來。 原文地址:https://devblog ...
  • 想要實現二維數組中根據某個欄位排序,一般可以通過數組迴圈對比的方式實現。這裡介紹一種更簡單的方法,直接通過PHP函數實現。array_multisort() :可以用來一次對多個數組進行排序,或者根據某一維或多維對多維數組進行排序。詳細介紹可參考PHP手冊:https://www.php.net/m ...
  • 常用的軟體: 播放器: cloundMusic(網易雲音樂) https://music.163.com/#/download PotPlayer(一款強大的視頻播放器) https://daumpotplayer.com/download/ ACDsee(ACDsee圖片編輯器免費版) https ...
  • 發現問題 在一次偶然中,在爬取某個網站時,老方法,打開調試工具查看請求方式,請求攔截,是否是非同步載入,不亦樂乎,當我以為這個網站非常簡單的時候,發現二級網頁的地址和源碼不對應 Ajax非同步載入?源碼也是這樣的 而且這些鏈接直... ...
  • 準備年後要跳槽,所以最近一直再看面試題,並且把收集到的面試題整理了以下發到博客上,希望對大家有所幫助。 首先是集合類的面試題 1. HashMap 排序題,上機題。 已知一個 HashMap<Integer,User>集合, User 有 name(String)和 age(int)屬性。請寫一個方 ...
  • JVM體繫結構圖 Native Interface(本地介面) Java本地介面(Java Native Interface (JNI))允許運行在Java虛擬機(Java Virtual Machine (JVM))上的代碼調用本地程式和類庫,或者被它們調用,這些程式和類庫可以是其它語言編寫的,比 ...
x