2016-05-11 24 views
0

對此有點困惑。請參閱playground調用帶父級結構嵌入父項的函數不起作用

我希望去允許你調用一個方法,該方法需要一個嵌入父級的子級的父級。

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 
} 

如果我把這個以「child.Parent」它的工作原理,但在這種情況下,我不能利用該值作爲空接口函數中使用的任何代碼。谷歌搜索出來,發現一個非常有趣和有用的頁面。 Golang concepts from an OOP point of view。任何關於我在這裏失蹤的指導都是值得歡迎的。也許這只是我沒有完全「讓」Golang在這裏。

回答

4

Golang不支持繼承,所以父母和孩子的概念不存在。這使得名稱在下面的文字中變得混亂。它也表明你需要在重新實現繼承和設計數據結構之間進行思維跳躍。這個問題花了我一些時間來解決我的問題,答案是'不是從繼承層次開始的,而是想知道如何去做,從開始並設計你想要的工具'

SomeFunction定義爲將Parent作爲參數,因此您必須將它傳遞給父級。如果你想通過這一個孩子,你需要做的this,即使用:

SomeFunction(child.Parent) 

這就是你要做的傳遞嵌入式結構。

不過,我懷疑你真正想要做的是聲明瞭Parent的接口,有Child實現它,並且有SomeFunction採取Parent接口。那麼你的困惑就是當前Parent有一個數據成員,並且接口只有函數。解決這個問題的最好方法取決於你想要做什麼,但是一條路線是提供另一個函數來返回數據成員。所有'孩子'類都可以嵌入這個數據成員,並且函數可以返回它(或指向它的指針)。但是,如果沒有更清楚的想法,你只能猜測。

+0

使用Person界面編寫了一個快速操場https://play.golang.org/p/_JfXyyflP8 ...這是另一個有用的博客文章https://medium.com/@gianbiondi/interfaces-in-go- 59c3dc9c2d98#.7l72q6qwg – poopoothegorilla

+0

謝謝!結束使用一個接口,允許我訪問「父」結構的成員。你是對的,問題在於我試圖按照習慣於在面向對象方式中做事情的方式去做事情,並努力想辦法在Go中完成它們,同時保持DRY。感覺我沒有做正確的事情,因爲我在複製代碼。 – Toby