2016-04-12 20 views
-1

以下のサンプルに基づいて、「フィールドに構造体を埋め込む」という点は、Goの「プロモーション」メカニズムを破ることにあるようです。なぜあなたはこれをしたいのですか?フィールド(golang)に構造体を埋め込む目的は何ですか?

type obj1 struct { 
    obj2 
} 

type obj1Selector struct { 
    selector obj2 
} 

type obj2 struct { 
} 

func (o obj2) printTest() { 
    fmt.Println("obj2") 
} 

func main() { 
    o := obj1{} 
    o.printTest() //fine 

    oSelector := obj1Selector{} 
    oSelector.selector.printTest() //fine 
    oSelector.printTest() //not fine 
+4

「this」を使うたびに、子猫が死ぬ。 [Effective Go](https://golang.org/doc/effective_go.html)のガイドラインに従い、適切な名前を付けてください。例えば、: 'func(o obj2)printTest()...' – eduncan911

+2

私はあなたが何を尋ねているのか、それがどのように「go/types」パッケージ(あなたは使用していない) 。ここで何が起こると思いますか? – JimB

+1

私はこれを修正しました。動物を傷つけないでください。 – Charlie

答えて

1

何も別名ではなく、セレクタはドット表記を使用している型で参照できるものを指します。埋め込みという概念を使用しています。obj1埋め込みobj2です。 obj1Selectorにはselectorというobj2という1つのフィールドがあります。エイリアスはこのようになります。 type obj3 obj2obj3obj2の別名として宣言しています。

Goのプロモーションメカニズムが壊れていますか?申し訳ありませんが、これがどのように機能するかという全体的な考え方は根拠がありません。 obj1Selectorにはタイプobj2が埋め込まれていないため、obj2のプロモートのフィールド/メソッドはありません。obj1埋め込みobj2のため、フィールド/メソッドが 'プロモート'されています。 obj1Selectorは、そのインターフェイスを実装していません。obj1Selector.selectorは実装しています。

なぜ埋め込みたいのですか?まあ、継承と同じですが、少なくともGoで開発するときに同様の機能セットを提供します。たぶん私はデータストアに10の共通フィールドを共有しているテーブルをいくつか持っています。 C++やC#やJavaのような典型的なOO言語の重複を減らすために継承を使用するのと同じように、私はGoに埋め込みを使用します。私の意見では、それがその主な使用例です。それは、構成と継承の不思議な組み合わせのようなものです。あなたは他人のオブジェクト(あなたが埋め込んでいるもの)で作っていますが、埋め込み型メソッド/フィールドは埋め込み型スコープに昇格されているので、埋め込み型から継承した場合と同じように機能します。あなたがここで扱っていることについて何らかの明確化を与えることを望みます。あなたは本当に答えることができる質問を提出したわけではありませんが、そのような長い機能/概念の説明のためのコメントにはスペースがありません。サンプルコードを使用してください。

+0

あなたの答えは私がエイリアスを作成していないことを理解するのに役立ちますが、あなたが言ったように「フィールドにタイプを埋め込む」理由はまだ分かりません。あなたが言ったように、それは "相続"を混ぜることではなく、構成は単一のタイプでは非常に混乱する方法ですか? – Charlie

+0

@Charlieこの2つのコンセプトが異なる言語から少し混乱しているように見えますが、一度使い始めると直感的です。典型的なOO言語で親クラスと子クラスを使用するような継承階層が必要な場合は、代わりに基本タイプを別のクラスに組み込んで同じ機能を実現します。それが動作する方法にいくつかの微妙な点がありますが、おそらく継承と同等であると見始めるのが最も簡単です。 – evanmcdonnal

+0

あなたの答えは私の質問に答えることはできませんでしたが、私はあなたにそれをより明確に言うのを助けてくれてありがとう。ここで洗練された質問をお読みくださいhttp://stackoverflow.com/questions/36704522/why-would-you-want-to-use-composition-in-golang – Charlie

関連する問題