私は現在、いくつかの go コードをいじっていますが、満足のいく答えが見つからない埋め込みに関する小さな問題に遭遇しました。一方が他方を埋め込み、インターフェイスを満たす 2 つの型が与えられた場合、オブジェクトがデフォルトの応答を提供するために埋め込み型のプロパティを反映できるようにしたいと考えています。オーバーライドしたい場合を除いて、インターフェース内のすべてのメソッドを定義します。
以下のおもちゃの例では、デフォルトのケースを処理し、名前を返すだけの hello() func を組み込みで定義できるようにしたいと考えています (NB これはおもちゃの例であり、実際のコードはより複雑で便利です)。オブジェクトがインターフェイスのすべてのメソッドを明示的に定義する必要があります。実際のコードでは、リフレクションを使用してオブジェクト型のクラス名と構成名を推測しています。現在、型のインスタンスを渡す基底クラス ヘルパーを呼び出していますが、これは満足のいくものではありません。
package main
type MyInterface interface {
hello() string
//...
}
type Embedded struct {
}
func (e *Embedded) hello() string {
name := "none"
// Would like to be able to return name of object here *if* embedded
// What's the best approach to tackle this?
return name
}
type Object struct {
*Embedded
Name string
}
/*
// Would like an *optional* override, with default being embedded somehow replying with data from Object
func (o *Object) hello() string {
return o.Name
}
*/
func main() {
o := &Object{Name:"My Object Name"}
println("Hello world",o.hello())
}
ゴープレイで:
http://play.golang.org/p/ClOOCef9Zb
この種の問題に移動する (埋め込みクラスのプロパティを使用するデフォルト関数を提供する) の他の解決策と、この特定の問題の解決策 (存在する場合) について知りたいと思います。これまでのところ、唯一の解決策は次のいずれかです。
このインターフェイスを満たすすべてのタイプでメソッド hello() の再定義を要求し、デフォルト メソッドを提供する「ベース」クラスを持つことをあきらめる オブジェクト インスタンスへのポインタを使用して埋め込みヘルパー関数を呼び出すので、タイプは呼び出しを行うほとんど空のメソッドを持つことができます埋め込みタイプ。
Goで価値があり、継承モデルを複製しようとしない完全に異なるアプローチがある場合、それらについて聞いてみたいと思います。これまでのところ、継承で見逃したのはこれだけです...