1. 程式人生 > >C#抽象基類與介面的區別

C#抽象基類與介面的區別

導讀:

  定義新的資料型別以及這些新的資料型別進行相互操作的方法
  定義方式:
   class Cat 
  

  }
 
  
class Cat:object 
  

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

        
publicvoid Cat() 
        

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

        
void Say(); 
  }
 
  建立一個Class1.cs檔案,定義兩個類,擴充套件IPolimorfism:
   using System; 
  
using System.Windows.Forms; 
  
namespace NorthWind 
  

        
publicclass Red:IPolimorphism //實現介面的方法 

        
publicvoid Say() //不需要指定override關鍵字 

        MessageBox.Show(
"Red!"); 
        }
 
        }
 
        
publicclass Yello:IPolimorphism 
        

        
publicvoid Say() //不需要指定override關鍵字 

        MessageBox.Show(
"Yello!"); 
        }
 
        }
 
          }
 
  另一個MainFrm.cs檔案,應用程式入口處:
   using System; 
  
using System.Windows.Forms; 
  
namespace NorthWind 
  

  
publicclass MainFrm : System.Windows.Forms 
  

        [STAThread] 
        
staticvoid Main() 
        

        IPolimorphism red 
=new Red(); 
        red.Say(); 
        IPolimorphism yello 
=new Yello(); 
        yello.Say(); 
        }
 
          }
 
  }
 
    舉個例子,有一個老漢,做了一個麵餅,給了他的幾個兒子,老大用這個餅,加上點餡,包一下,做成了包子,老二用這個麵餅,在外面刷上油,撒上料,烤一烤,做成了土家燒餅,老三呢,胡亂做,在餅上抹上亂七八糟的東西,烤一烤,做成了披薩餅.基類和派生類的關係就是這樣,基類提供了基本的實現,派生類就在上面添料,最終就成了每個人心中想要的餅.
  那介面的故事則不一樣,老漢沒有給眾人面,老漢這回給兒子們畫了一個餅的設計圖,規定了這個餅的厚度,直徑等等,然後把這個規格表發給兒子們了,兒子們拿著畫的餅,各自按自己的想法去做了.
  兩個故事的區別告訴我們,介面是一種規格,是一個統一的標準,在實際應用中,介面有兩方法的作用.
  1,通過介面更容易表現設計,更容易溝通,而且介面是沒有實現程式碼的,因此,定好介面,再寫實現程式碼,就算設計上有變動,也可以通過介面輕易實現修改.而如果不用介面的話,你將直接去寫類,好不容易實現了一個類的程式碼,如果設計上有少許的變動,就要去改程式碼.
  2.介面是寫類的實現者看的,這好比建築圖紙是畫給施工工人看的.
        轉自:http://blog.ppku.com/?p=58 

相關推薦

C#抽象介面區別

導讀: 類   定義新的資料型別以及這些新的資料型別進行相互操作的方法   定義方式:    class Cat   ...{   }   class Cat:object   ...{   }    C#中所有的類都是預設由object類派生來的,顯示指定或者省略效果是

抽象介面區別

一 介面和抽象類的相似性 1 介面和抽象類都不能被例項化,都可以通過繼承實現其抽象方法。 2 介面和抽象類都可以包含抽象方法,實現介面或繼承抽象類的普通子類都必須實現這些抽象方法。 二 介面和抽象類的區別 1 接口裡只能包含抽象方法,靜態方法和預設方法,不能為普

Java中抽象介面區別

抽象類:抽象類是無法例項化的特殊類。所以問題是為什麼我們需要一個不能被例項化的類,抽象類只能是子類(繼承自)。換句話說,它只允許其他類繼承它,但不能例項化。優點是它為所有子類執行特定的層次結構。簡

4.6 C++抽象和純虛成員函數

中新 error isp ... 先來 必須 pub 對象 c++ 參考:http://www.weixueyuan.net/view/6376.html 總結:   在C++中,可以通過抽象基類來實現公共接口   純虛成員函數沒有函數體,只有函數聲明,在純虛函數聲明結尾加

詳解C++中派生的轉換以及虛

原文來源:https://www.jb51.net/article/72586.htm# C++基類與派生類的轉換 在公用繼承、私有繼承和保護繼承中,只有公用繼承能較好地保留基類的特徵,它保留了除建構函式和解構函式以外的基類所有成員,基類的公用或保護成員的訪問許可權在派生類中全部都按原樣保留下來

C++虛虛繼承

為什麼有虛繼承 多繼承(Multiple Inheritance)是指從多個直接基類中產生派生類的能力,多繼承的派生類繼承了所有父類的成員。儘管概念上非常簡單,但是多個基類的相互交織可能會帶來錯綜複雜的設計問題,命名衝突就是不可迴避的一個。 多繼承時很容易產生命名衝

C++抽象

當類宣告中包含純虛擬函式時,則不能建立該類的物件。這裡的理念是,包含純虛擬函式的類只用作基類。原型中的=0使虛擬函式成為純虛擬函式。這裡的方法Area()沒有定義,但c++甚至允許純虛擬函式有定義。例如,也許所有的基類方法都與Move()一樣,可以在基類中進行定義,但你仍需要將這個類宣告為抽象的。在這種情況下

C++】拷貝建構函式的呼叫順序

先看一段程式碼: #include <iostream> using namespace std; class Base { public:     Base()     {         cout<<"Base()\n";         m_a

C++中抽象介面區別

一、抽象類和介面抽象類:抽象類是特殊的類,不能被例項化(將定義了純虛擬函式的類稱為抽象類);除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的,但同時也能包括普通的方法。

Java抽象介面區別及default關鍵字學習總結

抽象類 可看做是不可例項化的普通類,可以擁有構造方法,可以有main方法 抽象類中的方法可以是抽象方法(抽象方法必須存在於抽象類中),也可以是普通方法、靜態方法 可以宣告變數 抽象類可以繼承其它類,也可實現介面 抽象類的派生類,必須覆蓋父類中abstract修

Java抽象介面區別

2014/07/16 | 分類: 基礎技術 | 6 條評論 | 標籤: 抽象類, 介面 分享到: 很多常見的面試題都會出諸如抽象類和介面有什麼區別,什麼情況下會使用抽象類和什麼情況你會使用介面這樣的問題。本文我們將仔細討論這些話題。 在討論它們之間的不同點之前,

PHP中抽象介面區別

PHP中抽象類與介面的區別 抽象類abstract 概念 定義為抽象的類不能被例項化。任何一個類,如果有一個方法是被宣告為抽象的,那麼這個類就必須被宣告為抽象的類。 繼承一個抽象類的時候,子類必須定義父類中的所有抽象方法,這些方法的訪問控制必須喝父類中一樣或者更為寬鬆。 例如,某個抽象方法被宣告為pro

抽象介面區別

最近 不忙,學習一下基礎薄弱的地方,寫下部落格,鞏固一下學習內容,同時希望可以幫助他人。 關於抽象類和介面  在我們日常專案中 ,經常會用到抽象類和介面。此處簡略的以舉例的方式 來對二者進行區分: 比如說 ,我們 需要寫幾個類,分別為cat ,dog ,bird 三個類,

java 抽象介面區別

抽象類:抽象類是用來捕捉子類的通用性的,不能被例項化,只能做為子類的超類,抽象類是被用來建立繼承層級裡子類的模板的。    首先了解一下抽象方法。抽象方法是一種特殊的方法,只宣告而沒有具體的實現,宣告格式為:abstract void fun (); 抽象方法必須由abs

最簡單方法淺析抽象介面區別

介面和抽象類有什麼區別你選擇使用介面和抽象類的依據是什麼?介面和抽象類的概念不一樣。介面是對動作的抽象,抽象類是對根源的抽象。抽象類表示的是,這個物件是什麼。介面表示的是,這個物件能做什麼。比如,男人,女人,這兩個類(如果是類的話……),他們的抽象類是人。說明,他們都是人。人

android之抽象介面區別

今天無意在網上看到抽象類跟介面的區別的總結,發現自己都忘的差不多了,就順手牽羊拷貝了一份,有空也可以看看。 含有abstract修飾符的class 即為抽象類,abstract類不能建立例項物件,含有abstract的方法的類必須定義為abstract class ,

抽象介面區別 Java描述

abstract class和interface是Java語言中對於抽象類定義進行支援的兩種機制,正是由於這兩種機制的存在,才賦予了Java強大的面向物件能力。abstract class和interface之間在對於抽象類定義的支援方面具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對於

java中抽象介面區別

抽象類:抽象類更多的是用來定義一個很多東西的本質,即他是不是,如果我們可以宣告一個抽象類annimal,然後新建一個cat類去繼承

走進C# abstract,瞭解抽象介面的異同

前言:   最近在研究.NET Core的一些類庫原始碼的時候發現在底層類庫中使用了大量的抽象類,然而發現自己搬磚這麼多年好像從來沒有在專案中使用抽象類或者抽象方法去實現某個功能模組,並且對修飾符Abstract概念也只懂得一些皮毛(也就是面試的時候會問下其基本作用)。當然,咱們不懂就要去慢慢的學習瞭解,不能

OOP2(虛函數/抽象/訪問控制繼承)

控制 space protected 相對 mes nbsp 獨立 friend 抽象類 通常情況下,如果我們不適用某個函數,則無需為該函數提供定義。但我們必須為每個虛函數都提供定義而不管它是否被用到了,這因為連編譯器也無法確定到底會適用哪個虛函數 對虛函數的調用可能在