C#虛基類繼承與接口的區別


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

    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.接口是寫類的實現者看的,這好比建築圖紙是畫給施工工人看的.


免責聲明!

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



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