程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++與C#對比學習:面向對象,class類(一)

C++與C#對比學習:面向對象,class類(一)

編輯:C++入門知識

面向對象的小故事   
 

     面向對象程序語言中最重要的概念無疑是class,所謂一切皆對象.(不過要是老天天呆電腦前寫代碼研究面向對象語言,那要真找對象找老婆就很成問題.可不是滿世界的美女們都皆是你對象.) 類是一個抽象的概念,和我們現實生活中對事物分類起名差不多,比如美女,帥哥,二奶,官二代這樣的名詞就是一個類,代表具有相似屬性的一類事物.每一個類實例化之後就是對象.就像美女這一類人中具體的某個美女才是一個對象,有可能成為你的對象.現實世界中的所有事情事件都能分成一類一類的,一個叫維特根斯坦的老兄呆監獄裡的時候閒得蛋痛就琢磨著從語言學邏輯學的角度來把整個世界五馬分屍,分為一些啥原子事件.然後這些原子事件通過些邏輯組合能形成一個復雜的現實世界.他的那本書叫<邏輯哲學論>.據傳聞面向對象的思想就是從他的思想演化來的,不過傳說就跟绯聞一樣,真真假假誰知道啊.很多聰明人想問題時可能會得出些相同結論.有人說萊布尼茲發明二進制也是受易經的啟發,那八卦圖上有著二進制的原理

 

抽象類和接口的比較
    從語法的層面講抽象類(abstract class)和接口(interface)區別不大,可以都看成一種特殊的類.只有從設計的層面考慮才有比較重要的意義,那只有做構架師時才去考慮的事了啊,像我們這樣命苦的碼農還是老實的把語法搞懂,把代碼敲好.抽象類是完全體現類的概念,對某一類具有相同屬性事物的抽象,只不過它是為了做父類,讓子類繼承的.所以很多函數可以只聲明在那裡,不用去定義實現.而接口不是完全體現類的概念,不是對相同的屬性的抽象,還是定義一系列行為准則.所謂接口顧名思義,我們平時裝燈泡啊,電腦上的USB接口,耳塞接口都是有個統一標准的,你的U盤可以插任何電腦上,如果沒有個這樣的統一的接口標准,那沒法插的啊。接口一般在不同的project之間調用時用的較多點,把project裡面其他東西都封裝了,你知道接口就行,特別是C++如果要調用C#的com組件的話,com組件要強制要用到接口的.所以用的時候你只管調用接口中的函數就行,怎麼實現就不用管了.當然接口是不能實例化的,但你可以通過接口指針指向實現了接口的類,在C#中沒有指針的話就可以這樣InfaceClass instance = new ClassCompleteInterface(); 這其實和指針蠻像的.C++中每個class都可以有個頭文件,頭文件其實蠻像接口的.也是體現了接口那種思想.不過在C#中沒有頭文件的概念了.不過C#中有個partial class的概念,這樣一個class的代碼可以分布在多個文件中,如果你想模擬出c++的頭文件,可以用它做到.

    除了在不同的project中比較有用,接口在同一個project中也同樣有用了.特別在C#中由於class不能像C++中一樣實現多重繼承,只能單繼承,但接口可以多繼承.所以如果項目要擴充些功能,要在某個類中新添加些功能.可以先添加一個接口,聲明需要實現些啥功能,然後在原來某個class中繼承這個接口,並實現它.站在設計者的角度,一個是要隱藏實現細節,就是所謂的封裝.另一個就是便於擴展,添加新內容進去.

  設計者們在設計時先是數據建模,把一個系統抽象出來然後分割成一小塊一小塊的.每一小塊就對應一個class.當然他們設計時可不去管具體的代碼實現細節,所以設計出來的class都基本上是些函數的聲明.也就是一個個的抽象類,接口(這個不一定是代碼中的概念,到最後轉化成代碼時可能會是抽象函數,接口,但也可能是一般的類)

 

上面是講的概念性的東西,現在來講下語法細節
C# 接口用法
  public delegate void IamPointer(string input); //這個自然不是必需的,只是為了下面使用事件而在此定義的.

    interface Weiwenhp

    {

        //string name;                   //這樣會出錯,接口中不使用字段

        int Number{ get; set; }      //屬性

        void DoIt(string cmd);       //函數

        int this[int index] { get; set; } //索引器

        event IamPointer MyEvent;  //事件

    }

1.接口不能實例化,但假如有個類Arwen繼承了Weiwenhp.你可以這樣用Weiwenhp    instance = new Arwen();  //這樣不會出錯的.Weiwenhp instance = new Weiwenhp();自然不行

2.定義接口時可用訪問修飾符public 或internal.默認是internal(只能程序集內訪問).但接口裡面的函數等聲明不能用任何訪問修飾符.

3.接口中只能有函數,屬性,索引器,事件的聲明.後三者都是C#中新添加的特性.屬性和索引器可以簡單的理解為一種特殊的函數,封裝class內部的字段,對外提示一個接口.屬性一般封裝基本類型,索引器一般封裝數組類型.事件可以簡單理解為對代理的封裝,而代理有點類似函數指針.另外接口中是不能有靜態函數和虛函數的聲明

 

C# 抽象類
和一般類基本上一樣,只不過定義時加個修飾符abstract.比如 abstract  class MyClass{ }

和一般類只有幾個細小的區別

1..首先自然是不能實例化,但可以像接口一樣那樣實例化.另外類中可以用到抽象函數(但也可以沒有抽象函數),比如public abstract void Fun(); //一般的類是不能用抽象函數的

2.抽象類內部的函數等訪問修飾符不能為private,因為它的設計目的就是讓別人來繼承它的.由於類內部不加修飾符時默認都是private,所以抽抽象類中所有函數,等都要加修飾符.當然字段除外,它可以是private.

3.除了上面的區別外,抽象類完全跟一般類一樣.其實你拿個一般的類過來,直接加個abstract 就變成個抽象類.一點問題都不會有.

 

C++接口

據說標准C++中是沒有interface的,平時用到的interface實際上是通過一些宏來實現的,背後的原理還是虛純基類.這個還有待研究

 

C++抽象類
C++的抽象類跟C#的抽象類區別還是比較大的.C#中抽象類的標志就是class前面有個abstract就行了.然後class內部就跟一般類差不多.

而C++抽象類不會用到abstract關鍵字,它的標志是在class內部至少要有一個純虛函數(這是C++獨有的概念),C#中沒有.

舉個例子

class  Arwen

{

  int age;

public:

virtual void Fun(int num) = 0; //這就是純虛函數了.

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved