私は「クラシックOO」の例をGoに変換しようとしています。サブクラスのセットは独自にいくつかのメソッドを実装しますが、スーパークラスを介していくつかのメソッドの実装を共有します。私はGoのインターフェースの使い方をよく知っており、埋め込みも使用しましたが、この意図された動作をキャプチャするためにどのイディオムを採用するべきか、よくわかりません。
これが具体的で、おそらく非常によく知られている例です。Rubyを使用します。動物には犬と牛の2種類があります。すべての動物には名前があり、話すことができます。動物の種類に関係なく、同じように設定して取得する方法は同じです。彼らが作る音はサブクラスによって異なります。これでspeak
、すべての動物に共通のメソッドがありますが、サブクラスのsound
メソッドに委譲されます。ここではRubyです:
class Animal
def initialize(name); @name = name; end
def speak; puts "#{@name} says #{sound()}"; end
end
class Dog < Animal; def sound(); "woof"; end; end
class Cow < Animal; def sound(); "mooo"; end; end
これはGoでどのように最もよくキャプチャされますか?
これまでに試しました
type Animal struct {
name string
}
type Cow struct {
Animal
}
type Dog struct {
Animal
}
そして、私は次のように「動物」を構築することができました:
func (d Dog) sound() string {return "woof"}
func (c Cow) sound() string {return "mooo"}
func main() {
d := Dog{Animal{"Sparky"}}
c := Cow{Animal{"Bessie"}}
fmt.Println(d.name)
fmt.Println(c.sound())
}
しかし、私はこれについてすべて間違っていると感じています。sound()
インターフェイスを配置できることはわかっていますが、特定の動物は実際の動物ではなく、音響器です。Animal
インターフェースになった場合、名前と発言コードを共有できません。Goのデザイナーはインターフェースのみを使用しており、Ruby、Python、Javaなどで行われているように、この古典的なOOのユースケースを直接サポートしないことを選択しましたが、いくつかのイディオムまたはベストがあるはずですこれをシミュレートするための練習。そうするための好ましい方法は何ですか?
しかし、私はこれをシミュレートするためのいくつかのイディオムまたはベストプラクティスがあるはずだと思います。
いいえ、ありません。
そのようなことが発生した場合(実際のコードではそれほど頻繁ではありませんが、ほとんどがJava / Ruby /その他のコードの翻訳で)、それらinterface Named { Name() string }
をinterface Sounder { Sound() }
組み合わせてinterface Animal {Named, Sounder}
、それらの動物に渡します。
繰り返しますが、「推奨される方法」は、継承なしでソリューションを再構築することです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加