2016-05-11 14 views
0

少し混乱しています。 playgroundをご覧ください。親をstruct embedding parentで呼び出す関数が機能しません。

私は、その親を埋め込んだ子を持つ親を取るメソッドを呼び出すことができます。私は「child.Parent」でこれを呼び出した場合

package main 

import (
    "fmt" 
) 

type Parent struct { 
    A string 
} 

type Child struct { 
    Parent 
} 

func SomeFunction(parent Parent) { 
    fmt.Println("%v", parent.A) 
} 

func main() { 
    child := Child{Parent{A:"test"}} 
    SomeFunction(child) //prog.go:21: cannot use child (type Child) as type Parent in argument to SomeFunction 
} 

は、それが動作しますが、その場合には、私は空のインターフェースとして値を利用して関数内の任意のコードを使用することはできません。これを知って、非常に興味深く役に立つページを見つけました。 Golang concepts from an OOP point of view。私がここで紛失していることに関するガイダンスは歓迎です。おそらく、これはゴーランをここで完全に「取得」しているわけではない。

答えて

4

Golangは継承をサポートしていないため、親と子の概念は存在しません。これにより、以下のテキストでは名前が混乱します。また、継承を再実装することと、やり方でデータ構造を設計することの間に精神的な飛躍を必要とすることも示しています。これは非常に問題は私のまわりで私の頭を取得するためのいくつかの時間を取って、答えは「継承階層で開始し、外出先でそれを行う方法を疑問に思う、あなたが利用可能なツールで何をしたいのか、外出先やデザインで始まらないました'

SomeFunctionは、パラメータとしてParentを取得するように定義されているため、親に渡す必要があります。あなたはそれを子供に渡したい場合、あなたは、すなわち使用をthisを実行する必要があります。

あなたが埋め込まれた構造体を渡すために何をすべきかだ
SomeFunction(child.Parent) 

しかし、私はあなたが本当にやりたいことは疑いChildはそれを実装し、Parentインタフェースを取るSomeFunction持っている、Parentと呼ばれるインタフェースを宣言しています。あなたの混乱は現在、Parentにデータメンバーがあり、インターフェイスには機能しかないことになります。一番きちんとした方法は、あなたが何をしようとしているかによって異なりますが、データメンバーを返すための別の関数を用意することです。すべての '子'クラスは、このデータメンバを埋め込み、関数がそれを返すことができます(またはそれへのポインタ)。しかし、あなたがしようとしていることをより明確に理解することなく、これは推測だけです。

+0

人インタフェースhttps://play.golang.org/p/_JfXyyflP8を使用して迅速な遊び場を書いた...ここでは、別の有用なブログ記事がありますhttps://medium.com/@gianbiondi/interfaces-in-go- 59c3dc9c2d98#.7l72q6qwg – poopoothegorilla

+0

ありがとう!私は "親"構造体のメンバーにアクセスすることができますインターフェイスを使用して終了しました。あなたは、私は物事私はOOでそれらをやってDRY滞在しながら移動して、それらを達成する方法を考え出すのに苦労に慣れている道をやろうとしている右の問題であることです。私はコードをコピーしているので、私は正しく何かをしていないように感じる。 – Toby

関連する問題