2016-07-19 7 views
0

GoのようにCのインターフェイスにどのようにプログラムすることができますか?Cのインターフェイスへのコーディング

移動コード:

package measure 
type Weighable interface { 
    Weigh() float64 
} 
func Weight(w Weighable) float64 { 
    return w.Weigh() 
} 

すぐのfloat64を返す計量()メソッドを持つ任意の種類は "Weighable" であると考えられます。

package planet 
type Info struct { 
    volume float 
    density float 
} 
func (own *Info) Weigh() float64 { 
    return own.volume * own.density 
} 

惑星は計量可能なので、計量できます。

package main 
import "measure", "planet" 

func main() { 
    Earth := &planet.Info{1097509500, 5.51} 
    EarthWeight = measure.Weight(Earth) 
} 

今何でも、人や亜原子粒子は、異なった計量してもよいが、同じコードを使用して呼び出すことができ、measure.Weight(人)またはmeasure.Weight(subatomicParticle)

関数のシグネチャを定義

ヘッダファイル、続行するための正しい方法のようですが、どのようなインターフェースを取る機能について:質問は


議論として?これはC言語でできますか、それとも良い方法がありますか?

+0

-1?役に立つヒント、修正など?役に立つ返信で有効な質問のように思えますが、私に言っているのは、ただ削除するだけなのですか?わかりません。 – ridthyself

+0

いいえ、多分それは読者がそれが下降声のための有用であるか、または他の動機ではないと考えることを意味するかもしれません。しかし、それは確かに有効な質問です(*おそらく、大きな質問ではありません*)が有効です。 –

答えて

4

できません。それはどのようにプログラムが意味されているの方法ではありません。オブジェクト指向の機能を望むなら、に最も近いものはです。あなたは純粋仮想方法class ESを書くことができます

では、彼らは純粋仮想

public: 
    virtual int pure_virtual_method() = 0; 
    //        ^this means PURE VIRTUAL 

として、あなたがそれらを宣言するクラスの実装を必要としませんし、このクラスから継承する任意のクラスMUST実装pure_virtual_method()

インターフェイスは、たとえば、java言語で理解されているとおりです。あらかじめ定義されていますが実装されていないメソッドを持つクラスのスケルトンがあり、そのスケルトンからクラスを派生させて、いくつかのメソッドに実装を強制します。これは本当にエレガントで、私が愛している唯一のものはほとんどです。

:オブジェクト指向ライブラリは私がを知っているが、それは本当に厄介だと私は本当に彼らが「指向オブジェクト」を作る方法を言っていませんがあります。継承は可能ですが、それは私の好みには複雑すぎます。

Cで
2

、あなたがこのような目的球テーブル(in fact, OLE technologies are implemented using this principle)を実装することができます:関数はapproproiateオブジェクトへのポインタを持っている必要がありますどのように

typedef struct tagOBJECT OBJECT; 

// This is the interface 

typedef struct tagIVTABLE { 

    int (*getData)(OBJECT* This); 
    void (*setData)(OBJECT* This, int i); 

}IVTABLE; 

typedef struct tagOBJECT { 

    IVTABLE* lpVtbl; 

    int data; 

} OBJECT; 

int someGetFunction(OBJECT* This) { 

    return This->data; 
} 

void someSetFunction(OBJECT* This, int i) { 
    This->data = i; 
} 

int main(void) 
{ 


    IVTABLE Vtbl; 

    OBJECT obj; 
    OBJECT obj2; 

    Vtbl.getData = someGetFunction; 
    Vtbl.setData = someSetFunction; 

// You would code this in a constructor function 
obj.lpVtbl = &Vtbl; 
obj2.lpVtbl = &Vtbl; 


obj.lpVtbl->setData(&obj, 7); 

printf("\n%d", obj.lpVtbl->getData(&obj)); 

obj2.lpVtbl->setData(&obj2, 77); 

printf("\n%d", obj2.lpVtbl->getData(&obj2)); 

return 0; 
} 

お知らせ... C++コンパイラは、インスタンスメソッドでは、この隠しパラメータを生成しますキーワードthisはそのパラメータを参照します。この例は原理を説明するためのものです。それが助けてくれることを願って:-)

+0

メソッドの再実装を強制する方法はなく、IMHOによって[tag:c]コードを理解したり使用したりするのが難しくなります。非オブジェクト指向言語でオブジェクト指向の概念を試して使用する理由はありません。また、インターフェイスに関する最も重要なことはここにはありません。メソッドが実装されていない浅い基底クラスからクラスを派生させることはできません。基本的には、*メソッドが存在することを保証する*目的を果たすだけですが、それらの実装は派生クラスに任せられます。 –

+0

この構文 'obj.lpVtbl-> setData(&obj、7);は扱いにくいですが、[tag:c] way' v_tbl_set_data(&obj、7) 'ははるかに単純です。とにかく、オブジェクトに定義された関数を持つだけで、正当な理由でオブジェクトのサイズが大きくなります。 –

+0

私はあなたに同意します。 Cでは、オブジェクト指向の原則を実装するためのHASが1つあります。指摘したように、すべてがもっと面倒で分かりにくいです。これはちょうど質問に答えることでした。 –

関連する問題