2012-01-23 18 views
6

Goでは、インターフェイスに定義されているすべてのメソッドがタイプに含まれている場合、明示的に継承することなくそのインターフェイス変数に割り当てることができます。C/C++のGoインタフェースを模倣することは可能ですか?

C/C++でこの機能を模倣することはできますか?

+0

ある意味では、テンプレートがそうです。テンプレート化された引数を使用して関数を呼び出す場合は、テンプレートの使用方法で定義されている要件を満たすオブジェクトを渡すことができます。 – Bill

答えて

3

はいC. に書き込まれます。純粋な抽象クラスを使用し、テンプレートクラスを使用して抽象クラスを「実装」することで抽象クラスを拡張することができます。ここにベアボーンの例があります:

#include <iostream> 

// Interface type used in function signatures. 
class Iface { 
public: 
     virtual int method() const = 0; 
}; 

// Template wrapper for types implementing Iface 
template <typename T> 
class IfaceT: public Iface { 
public: 
     explicit IfaceT(T const t):_t(t) {} 
     virtual int method() const { return _t.method(); } 

private: 
     T const _t; 
}; 

// Type implementing Iface 
class Impl { 
public: 
     Impl(int x): _x(x) {} 
     int method() const { return _x; } 

private: 
     int _x; 
}; 


// Method accepting Iface parameter 
void printIface(Iface const &i) { 
     std::cout << i.method() << std::endl; 
} 

int main() { 
     printIface(IfaceT<Impl>(5)); 
} 
0

GObjectとおおよその同等性が実現する可能性があります。

0

私はC++のためにそれを刺しました。私は動作するもので終わったが、マクロサーカスである:https://github.com/wkaras/c-plus-plus-misc/tree/master/IFACE。インターフェイスは2つのポインタです.1つはオブジェクトデータメンバに、もう1つは仮想テーブル(メンバ関数を呼び出すサンク関数へのポインタの構造)に相当します。これらのテーブルは、(残念ながら)実行時に生成されます。インタフェースからサブインタフェースへの変換では、unordered_mapのルックアップが必要であるため、O(1)の時間複雑度は平均です。同じように、派生クラスのポインタ/参照をO(1)最悪の場合の基本クラスに変換する場合と比較して、

これはあまり使用することはできませんが、インターフェイスをC++に(きれいに)追加することは比較的簡単であることがわかります。インターフェイスが継承ベースのオブジェクト指向よりも優れている場合があり、C++を小さく保つことを試みる限り、牛は納屋からうまく外れています。

関連する問題