2011-12-10 4 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'か宣言された '保護された。そうでなければエラーが発生しやすくなります。 –

答えて

5

抽象インタフェースは実装からインタフェースを分離:次にガレージクラスのようなものである可能性があります。ただ、PIMPLイディオムとして

  • はコンパイル時間を減少させ、
  • あなたはABIを壊すことなく実装を変更することができます。

両方とも、大きなプログラムでは重要な利点です。

1

インタフェースを使用して、たとえば異なるShapeオブジェクトのベクトルを持つことができます。さもなければ、三角形と長方形を混在させたコレクションを持つことができませんでした。あるいは、別のクラスにシェイプメンバーを持たせることができます。シェイプメンバーは、三角形または四角形のいずれかになります。これらはほんの一部の例です。

編集:

私は具体的な例を挙げてみましょう。 というインターフェースがあるとします。あなたがクラスを持っていると想像してくださいガレージは、単一のための部屋を持っています。さまざまなタイプの車を実装しました。すべてがインターフェイスを使用しています。

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

コメント無しDownvote? – tobier

1

C++(および他のオブジェクト指向言語)をプログラミングする際のよくある間違いは、継承を使いすぎることです。インタフェースは継承が正しく行われます。その理由は、インタフェースの強さが、同じタイプであるかのように、別のシステムの異なるタイプのオブジェクトを扱うことができるからです。 TriangleとCircleは、例えばシェイプにすることができ、スクリーン上に描画するためにグラフィックエンジンに渡すことができます。

インタフェースが継承よりも優れている理由は、継承された機能も含むため、クラスが実際に行うことをすぐに理解することが難しくなり、デバッグしてオブジェクトの内部状態が外部の方法。

散発的なことよりもインターフェイスを使用するこのタイプの構造の必要性は、小さな例では動機づけが困難ですが、プロジェクトが大きくなると明らかになります。上記のようなことを可能にすることに加えて、プログラムの一部の実装を置き換えることができます(instaceのデータベースアクセスとスタブされた実装を置き換えることができます)。

メンバーへの直接アクセスよりもインターフェイスを選択するパフォーマンス上の理由はありません。逆の方法では、仮想メソッドを呼び出すため、反対の方法はありません。しかし、これは大部分のケースで非常に小さなパフォーマンス上のペナルティです。

0

C++の詳細はこちらMI-Why should I avoid multiple inheritance in C++?ここで

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インタフェースが実装されるべき2つの純粋仮想メソッドを提供OnScreenOffとOnScreenOn:

「3インターフェイス」セクションとybungalobillの答え上に構築する、典型的なObserverパターンを考えますあなたのコード。この例は、Badaのスクリーン・リスナーに基づいています。そのようなイベントによって通知を受けることができます。

もちろん、他にも利点があります。コードライブラリの実装の詳細をユーザから隠すようにするなど

0

インターフェイス(Pure Abstractクラス)は一般的な機能を提供します。あなたの例では、Shapeクラスは汎用クラスです。つまり、Shapeクラスから実際のインスタンス(またはオブジェクト)を取得することはできません。四角形がシェイプか三角形がシェイプであると言うことができます。 Shapeが何であるか分からない限り、ShapeのAreaまたはPerimeterを計算することはできません。

インターフェイス(Pure Abstractクラス)は、そこから派生したクラスがすべてのメソッドを実装しなければならないというプロトコルを強制します。それ以外の場合は、インターフェースにもなります。インタフェースポインタは、関数または他のクラスに送信することができ、そこから実際の派生クラスの機能を呼び出すことができます。

たとえば、犬、蛇、人間などのすべての動物を派生させたAnimalというクラスがある場合、Animalポインタの配列(実際に派生したクラスのインスタンス)を送信してから、 Run()、Walk()、Eat()などの機能です。この場合の動物は汎用クラスです。

関連する問題