2011-12-10 41 views
4

看看這個代碼接口C++的好處?

#include<iostream> 

using namespace std; 

    //Shape is an Interface Class. No data and everything pure virtual 
    class Shape { 
    public: 
     virtual void Area(int length, int breadth) = 0; 
     virtual void Perimeter(int length, int breadth) = 0; 
     //Note, no data 
    }; 

    //Derived class - Inherits Shape as Public 
    class Rectangle : public Shape { 
    public: 
     void Area(int length, int breadth); 
     void Perimeter(int length, int breadth); 
    private: 
     int someData; 
    }; 

    //Derived class - Inherits Shape as Public 
    class Triangle : public Shape { 
    public: 
     void Area(int length, int breadth); 
     void Perimeter(int length, int breadth); 
    private: 
     int someData; 
    }; 

    int main() 
    { 
     Rectangle r; 
     Triangle t; 

     cout<<"\n\n"; 
     r.Area(3,4); 
     r.Perimeter(3,4); 

     t.Area(3,4); 
     t.Perimeter(3,4); 

     cout<<"\n\n"; 
     return 0; 
    } 

    void Rectangle::Area(int length, int breadth) 
    { 
     cout<<"\nThe Area of Rectangle for length = "<<length<<" and\ 
     breadth = "<<breadth<<" is "<<(length * breadth)<<endl; 
    } 

    void Rectangle::Perimeter(int length, int breadth) 
    { 
     cout<<"\nThe Perimeter of Rectangle for length = "<<length<<" and\ 
     breadth = "<<breadth<<" is "<<2 * (length + breadth)<<endl; 
    } 

    void Triangle::Area(int length, int breadth) 
    { 
     cout<<"\nThe Area of Triangle for length = "<<length<<" and\ 
     breadth = "<<breadth<<" is "<<(length * breadth)/2<<endl; 
    } 

    void Triangle::Perimeter(int length, int breadth) 
    { 
     cout<<"\nThe Perimeter of Triangle for length = "<<length<<" and\ 
     breadth = "<<breadth<<" is "<<(length * breadth)/3<<endl; 
    } 

我使用的界面中的代碼,但我的問題是什麼,我應該使用它,什麼是它的好處,沒有業績,沒有真正的需要的時候,我爲什麼我應該使用它(接口)。使用它有什麼意義,請你解釋一下。

謝謝!

+1

http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo閱讀本... –

+1

旁白:'Shape'應該有一個析構函數或者是'virtual'或宣佈' protected'。否則它的使用很容易出錯。 –

回答

5

抽象接口的接口從實現分離。正如PIMPL方法是

  • 減少編譯時間,並
  • 允許您更改執行不打破ABI。

這兩個都是大型項目的重要優勢。

1

一個接口可以用來擁有不同形狀對象的向量。否則,例如,您不能擁有混合三角形和矩形的集合。或者另一個班級可能有一個Shape成員,然後可以是三角形或矩形。這些只是一些例子。

編輯:

讓我舉一個具體的例子。假設你有一個名爲的汽車。想象一下,你想有一個類車庫,有一個單一的空間汽車。您已經實現了不同類型的汽車,所有這些都使用接口。然後車庫類可以是這樣的:

class Garage { 
public: 
    Car getCar(); // returns _theCar 
private: 
    Car _theCar: 
} 
+0

Downvote無評論? – tobier

1

編程C++(和其他面向對象的語言)時常見的錯誤是繼承太多。接口的繼承是正確的。原因是接口的強度是能夠在另一個系統中處理不同類型的對象,就好像它們是相同的類型。 Triangle和Circle都可以是Shapes,可以傳遞給圖形引擎在屏幕上繪製。

接口比繼承還包括繼承功能的'更好'的原因是,它很快就很難理解類的真實含義,調試它並驗證對象的內部狀態不能被使用外部方法。

這種類型的結構需要使用接口,而不是偶爾使用接口,這在很小的例子中很難激發,但在項目變大時變得很明顯。除了像我上面描述的那樣做之外,它們也可以使測試程序變得更容易,因爲您可以用一個stubbed實現來替換程序的一部分的實現(可以說是instace的數據庫訪問),並通過這樣做來實現你編寫自動測試來驗證程序的其他部分(例如處理數據)

沒有性能原因可以選擇接口而不是直接訪問成員,相反,因爲你會調用虛擬方法。然而,這在大多數情況下是一個非常小的表現懲罰。

0

查看更多關於C++ MI的信息 - Why should I avoid multiple inheritance in C++?

的「3接口」部分和ybungalobill的回答上構建,考慮典型的觀察者模式:

class MyClass : public IScreenListener 
{ 
public: 
    MyClass() 
    { 
     PowerManager::RegisterScreenListener(*this); 
    } 

    // Overriding from IScreenListener 
    void OnScreenOn() 
    { 
     // do as you like 
    } 

    void OnScreenOff() 
    { 
     // do as you like 
    } 
} 

這裏,IScreenListener接口提供了兩個純虛方法OnScreenOff和OnScreenOn這是在中實現你的代碼。這個例子基於Bada的屏幕監聽器:它允許你通過這樣的事件得到通知。

當然,還有其他好處。就像隱藏其用戶的代碼庫實現細節一樣,等等。

0

接口(純粹的抽象類)提供了一般功能。在你的例子中,類Shape是通用的。這意味着你不能從類Shape創建實際的實例(或對象)。在那裏你可以說一個矩形是一個形狀或一個三角形是一個形狀。除非你知道它是什麼形狀,否則你不能計算一個形狀的面積或周長。

接口(純粹的抽象類)強制執行一個協議,從它派生的類必須實現它的所有方法。否則,它也成爲一個接口。接口指針可以發送到函數或其他類,並從那裏你可以調用實際的派生類的功能。

例如,如果有一類叫做Animal的類,你可以從那裏得到所有的動物,如狗,蛇,人類等,你可以發送動物指針數組(實際上是其派生類的實例),然後調用像Run(),Walk(),Eat()等功能。在這種情況下動物是泛型類。