C#虛基類繼承與介面的區別

来源:http://www.cnblogs.com/zpx1986/archive/2016/06/16/5590797.html
-Advertisement-
Play Games

類 定義新的數據類型以及這些新的數據類型進行相互操作的方法 定義方式: C#中所有的類都是預設由object類派生來的,顯示指定或者省略效果是一樣的,所以上面的兩個例子是完全相同的。 C#中類包括:抽象類、密封類、非抽象類 abstract:表示修飾的類不完整,也就是抽象類,只能用做基類。 在使用是 ...


類 定義新的數據類型以及這些新的數據類型進行相互操作的方法 定義方式:

   class Cat {
      // ..........
   }
   class Cat : object {
      //  ..........
   }

C#中所有的類都是預設由object類派生來的,顯示指定或者省略效果是一樣的,所以上面的兩個例子是完全相同的。 C#中類包括:抽象類、密封類、非抽象類 abstract:表示修飾的類不完整,也就是抽象類,只能用做基類。 在使用是不能直接實例化,不能使用new運算符。 sealed:表示修飾的類不可派生,也就是密封類。 base:訪問最近的基類,也就是當前類繼承的類。



    class Cat:Animal
    {
      public void Cat()
      {
        base.Eat();
      }
    }

以上例子中base代表Animal。 註意:base只能在類的內部使用。 介面 一個介面定義一個協定。介面可以看成是特殊的抽象類,但是又有所區別。 一個介面可以從多個基介面繼承,而一個類或結構可以實現多個介面。 介面可以包含方法、屬性、事件和索引器。介面本身不提供它所定義的成員的實現,而抽象類中可以提供定義成員的實現。 介面只指定實現該介面的類或結構必須提供的成員。 介面本質上是一種類 不過他與類的區分還是很明顯的——不能實例化 他的精髓在於提供一些類共同的地方,而且能“多繼承” 我們知道所謂對象其實是數據和方法的封裝。介面的作用更多的是工程上的,一般上我們用他來封裝通用的行為,來達到程式的多態。 不必用object的觀點來統一介面,在我的感覺中,繼承簡化對象結構,增加代碼重用,介面抽象行為。 1. 介面本質上是類嗎 這個,要看你認為“類的本質是什麼”了,過多糾纏於這個說法,很容易陷入文字之爭,意義不大。 2. 介面和類有什麼區別和聯繫,主要是聯繫 區別: 類的定義需要“實現”,介面的定義只需要“聲明”; 類能實例化出一個對象,介面不能; 類只能單根繼承,介面可以多根繼承; 繼承一個類,相當於借用了它已實現的功能,實現一個介面,相當於對外做了一個承諾; …… 聯繫:類可以“實現”介面 3. 介面是否具備類的特征 這要看你認為哪些是“類的特征”,hehe,比如,“編譯後會生成一個 .class 文件”算不算特征…… 4. 介面是否是Object 不是。但可以用一個介面型的變數來引用一個對象,而且,被引用的對象,說到底,一定是一個 Object。 1、純虛類與介面不同的是,純虛類可以包含一些實現 2、用純虛類包含一些基本的功能或方法 3、用介面來定義客戶端與組件之間的通訊方法 4、虛基類的實現的變化可能會影響派生類 5、使用介面要比使用繼承具有更強的適用性 介面的一些特征; 不可以包含任何實現;沒有構造方法;任何成員都隱式聲明為public; 介面是負責功能的定義,項目中通過介面來規範類,操作類以及抽象類的概念! 而類是負責功能的具體實現! 在類中也有抽象類的定義,抽象類與介面的區別在於: 抽象類是一個不完全的類,類裡面有抽象的方法,屬性,也可以有具體的方法和屬性,需要進一步的專業化。 但介面是一個行為的規範,裡面的所有東西都是抽象的! 一個類只可以繼承一個基類也就是父類,但可以實現多個介面 PS:介面除了規範一個行為之外,在具體項目中的實際作用也是十分重要的,在面向對象的設計原則以及設計模式的使用中,無不體現作為一個介面的使用好處,最直接的就是設計原則中OCP(開放封閉原則),我們使用介面,而不需要關心他的具體實現,具體實現的細節變化也無關客戶端(使用介面的類)的使用,對與擴展是開放的,我們可以另寫一個介面的實現來擴展當前程式,而不影響上層的使用,但對修改是封閉的,即我們不能夠再去修改介面的定義,當然這個 “不能夠”是指在規範原則上不應該這麼做! 介面的使用–多態的實現:

    public interface IPolimorphism()
    {
       void Say();
    }

建立一個Class1.cs文件,定義兩個類,擴展IPolimorfism:

using System;
using System.Windows.Forms;
namespace NorthWind
{
   public class Red:IPolimorphism  //實現介面的方法
   {
      public void Say()  //不需要指定override關鍵字
      {
          MessageBox.Show("Red!");
      }
   }
     
   public class Yello:IPolimorphism
   {
      public void Say() //不需要指定override關鍵字
      {
         MessageBox.Show("Yello!");
      }
   }
     
}

另一個MainFrm.cs文件,應用程式入口處:

using System;
using System.Windows.Forms;
namespace NorthWind {
   public class MainFrm : System.Windows.Forms {
      [STAThread]
      static void Main() {
         IPolimorphism red = new Red();
         red.Say();
         IPolimorphism yello = new Yello();
         yello.Say();
      }

   }
}

舉個例子,有一個老漢,做了一個麵餅,給了他的幾個兒子,老大用這個餅,加上點餡,包一下,做成了包子,老二用這個麵餅,在外面刷上油,撒上料,烤一烤,做成了土家燒餅,老三呢,胡亂做,在餅上抹上亂七八糟的東西,烤一烤,做成了披薩餅.基類和派生類的關係就是這樣,基類提供了基本的實現,派生類就在上面添料,最終就成了每個人心中想要的餅.

那介面的故事則不一樣,老漢沒有給眾人面,老漢這回給兒子們畫了一個餅的設計圖,規定了這個餅的厚度,直徑等等,然後把這個規格表發給兒子們了,兒子們拿著畫的餅,各自按自己的想法去做了.

兩個故事的區別告訴我們,介面是一種規格,是一個統一的標準,在實際應用中,介面有兩方法的作用.

1。通過介面更容易表現設計,更容易溝通,而且介面是沒有實現代碼的,因此,定好介面,再寫實現代碼,就算設計上有變動,也可以通過介面輕易實現修改.而如果不用介面的話,你將直接去寫類,好不容易實現了一個類的代碼,如果設計上有少許的變動,就要去改代碼.

2。介面是寫類的實現者看的,這好比建築圖紙是畫給施工工人看的.


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

-Advertisement-
Play Games
更多相關文章
  • EPEL 是什麼? EPEL (Extra Packages for Enterprise Linux,企業版Linux的額外軟體包) 是Fedora小組維護的一個軟體倉庫項目,為RHEL/CentOS提供他們預設不提供的軟體包。這個源相容RHEL及像CentOS和Scientific Linux這 ...
  • http://pan.baidu.com/s/1pLByvUF ...
  • 在使用第三方類庫時,使用cocoaPods是非常方便的,具體使用方法可以參考:CocoaPods安裝和使用教程 的安裝使用方法。今天討論的問題是,我在使用的時候遇到了一些問題:用cocoaPod sinstall完成所需要的第三方類庫之後,在要用的地方導入(#import)發現不提示,雖然自己手寫之 ...
  • 在Linux中要修改一個文件夾或文件的許可權我們需要用到linux chmod命令來做. 語法如下: 命令中各選項的含義為 操作符號可以是: 設置mode所表示的許可權可用下述字母的任意組合: X 只有目標文件對某些用戶是可執行的或該目標文件是目錄時才追加x 屬性。 實例 修改文件可讀寫屬性的方法 例如 ...
  • 一. 準備工作 下載nsis相關工具包,點擊此下載 1. 安裝程式:nsis-2.46-setup.exe 2. 編輯程式:cnisedit203.exe 3. 幫助文檔:NSIS205幫助文檔.rar 4. 第三方庫:ExecCmd.dll、AddPath.nsh、WriteEnvStr.nsh ...
  • 我們知道,現在能調試.net程式通常有兩個,第一個是ILSpy,還是一個是Reflector,這兩個小反編譯軟體算是我們研究底層代碼中所擁有的一把 鋒利小尖刀~~~,比如你看到的ILSpy這樣的界面圖: 但是呢!!! 用過ILSpy的同學大概都知道,這個毛軟體是調試不了web代碼的。。。也只能調試調 ...
  • 一直以來苦苦尋求適合自己的ORM,之前也用過Entity Framework、ormlite、nhibernate、dapper,都感覺準備步驟繁瑣,除非公司提前已經搭建起來一套成熟的框架,那樣只能做下添肉的工作,短時間內不能獨立搭建。--廢話終止 直接上圖: 就這麼簡單。 ...
  • 方法、函數、過程、靜態變數、類、結構體、構造函數、析構函數、運算符重載、索引器、類型轉換重載、嵌套類型 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...