C#封裝繼承

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

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


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

一、封裝:

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

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、重寫和覆蓋的區別

 


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

-Advertisement-
Play Games
更多相關文章
  • 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 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...