2017-03-15 24 views
1

extends多くの言語が持っている振る舞いを表現したいと思います。継承とインターフェイス

type Base struct { 
     // Some fields 
} 

type BaseExtender struct { 
     Base 
     // Unique fields 
} 

type AnotherBaseExtender struct { 
     Base 
     // Unique fields 
} 

は今、私は唯一それが「類似フィールド」だ必要があるので、任意のBaseを取る関数を書きたい:私の移動コードで

は、私はそうのように見えるいくつかの構造体を持っています。

func UseTheBase(b Base) { 
     testVal := b.thingICareAbout 
} 

ただし、これは機能しません。私はいくつかのinterfaceに掘り行われ、私のような何かできると思っていました:Goが自動的メソッドの実装して、インターフェイスを推測することが表示されます除き

type Base interface { 
     // Some fields 
} 

を。この動作を模倣する方法はありますか?私はBaseを私の関数に渡すことができ、Base構造体のすべてのnopメソッドを実装する必要はありません。

ありがとうございます!

答えて

3

ベースは、Goでの継承が必要なことを意味します。Goは意図的に継承を避け、再作成しません。型を埋め込むことはできますが、データだけでなく埋め込み動作として考えることもできます(継承する言語に誘惑されるかもしれません)。

あなたのソリューションには正しい行がありますが、パブリックメソッドが必要であり、はいインターフェースはメソッドの観点から定義されています。

doitは、その引数がDoSomethingメソッドを持っている限り、それを気にしません。明らかにこれは簡単な例であり、そこには何の意味もありませんが、すべてのエクステンダで何かをオーバーライドする必要がある場合は、Baseが存在する理由を尋ねてください。単にフィールドを追加するだけであれば、必要な場所にフィールドを追加します。

他の言語で構築することができる種類の広範なタクソノミーを避けるようにしてください。

0

に追加するには、私が使用する共通のパターンがある:

type Base interface { 
    SomeFunction() int 
} 

type SimpleBaseImpl struct { 
    // Unique fields 
} 

func (s SimpleBaseImpl) SomeFunction() int { 
    return 0 
} 

type SomethingMoreComplicated struct { 
    SimpleBaseImpl 
    // Unique fields 
} 

その後、あなたは「タイプ」BaseとしてSomethingMoreComplicatedを扱うことができます - しかし、再び、組成物のためのgolangの好みに注意してその重要(ここに示す)を超えます継承。

関連する問題