Goで「スーパークラスメソッドの実装」をモデル化する最良の方法は何ですか?

レイトーラル:

私は「クラシック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]

編集
0

コメントを追加

0

関連記事

分類Dev

Goでコンストラクタ/初期化メソッドを実装する最良の方法は何ですか

分類Dev

Pythonクラスのメソッドを装飾するための最良の方法は何ですか?

分類Dev

Gradleでタスクをパラメーター化するための最良の方法は何ですか?

分類Dev

Goプログラムに静的リソースをバンドルする最良の方法は何ですか?

分類Dev

Django抽象モデル-抽象ビューメソッドで特定のアクセスを実装する方法は?

分類Dev

C#のループ内でパラメーター化されたメソッドを呼び出すための最良の方法は何ですか

分類Dev

グーグルクラウドストレージを実装するための最良の方法は何ですか?

分類Dev

Azure IoTEdgeのモジュールで長時間実行されるメソッドを開始するための最良の方法は何ですか?

分類Dev

サブクラスで実装されたメソッドの初期化を強制するデザインパターンはありますか?

分類Dev

特定のパラメータをメソッドに渡すための最良の方法は何ですか

分類Dev

(内部のforEachループからの)サービスメソッド呼び出しをモックするときにスローされるNullPointerException、このモックを実装する正しい方法は何ですか?

分類Dev

FirestoreでドキュメントIDのカスタムオブジェクトをモデル化する最良の方法は何ですか?

分類Dev

Rustの同じクラスの別の静的メソッドから静的メソッドを参照するための最良の方法は何ですか?

分類Dev

クロスワードパズルのGUIを作成するための最良の方法は何ですか?java

分類Dev

ExceptT a IOのようなモナドスタックのリソースを管理するための最良の方法は何ですか?

分類Dev

ソースコードを使用してナゲットパッケージをデバッグする最良の方法は何ですか?

分類Dev

クラスの単一のメソッドを共有モデルに制限する最良の方法は?

分類Dev

春に親クラスのフィールドをautowireするための最良の方法は何ですか?

分類Dev

この「インスタンスメソッドから静的フィールドに書き込む」findbugs警告を修正する最良の方法は何ですか?

分類Dev

リストを返すフィクスチャを使用してpytest関数をパラメータ化する最良の方法は何ですか?

分類Dev

モデルとアクションをMVCパターンのクラスに分割するための最良のアプローチは何ですか

分類Dev

オーバーライドする実装でメソッドのインターフェイスのデフォルト実装を呼び出す方法は?

分類Dev

ggplotに1000の回帰直線を追加する最良の方法は何ですか?(モデルベースのブートストラップ)

分類Dev

別のメソッドを呼び出すだけのメソッドをテストカバーするための最良の方法は何ですか?

分類Dev

Laravel Eloquent:関係(メソッド)でパラメーターを渡す際の最良の方法は何ですか、またその違いは何ですか

分類Dev

Swiftでパスワードを暗号化するための最良の方法は何ですか?

分類Dev

NPMパッケージをステップスルーするための最良の方法は何ですか

分類Dev

中断信号でサーバーのストップアクションを実装するための最良の方法は何ですか?

分類Dev

ユーザースキルメソッドを実装するための最良の方法-Rails4

Related 関連記事

  1. 1

    Goでコンストラクタ/初期化メソッドを実装する最良の方法は何ですか

  2. 2

    Pythonクラスのメソッドを装飾するための最良の方法は何ですか?

  3. 3

    Gradleでタスクをパラメーター化するための最良の方法は何ですか?

  4. 4

    Goプログラムに静的リソースをバンドルする最良の方法は何ですか?

  5. 5

    Django抽象モデル-抽象ビューメソッドで特定のアクセスを実装する方法は?

  6. 6

    C#のループ内でパラメーター化されたメソッドを呼び出すための最良の方法は何ですか

  7. 7

    グーグルクラウドストレージを実装するための最良の方法は何ですか?

  8. 8

    Azure IoTEdgeのモジュールで長時間実行されるメソッドを開始するための最良の方法は何ですか?

  9. 9

    サブクラスで実装されたメソッドの初期化を強制するデザインパターンはありますか?

  10. 10

    特定のパラメータをメソッドに渡すための最良の方法は何ですか

  11. 11

    (内部のforEachループからの)サービスメソッド呼び出しをモックするときにスローされるNullPointerException、このモックを実装する正しい方法は何ですか?

  12. 12

    FirestoreでドキュメントIDのカスタムオブジェクトをモデル化する最良の方法は何ですか?

  13. 13

    Rustの同じクラスの別の静的メソッドから静的メソッドを参照するための最良の方法は何ですか?

  14. 14

    クロスワードパズルのGUIを作成するための最良の方法は何ですか?java

  15. 15

    ExceptT a IOのようなモナドスタックのリソースを管理するための最良の方法は何ですか?

  16. 16

    ソースコードを使用してナゲットパッケージをデバッグする最良の方法は何ですか?

  17. 17

    クラスの単一のメソッドを共有モデルに制限する最良の方法は?

  18. 18

    春に親クラスのフィールドをautowireするための最良の方法は何ですか?

  19. 19

    この「インスタンスメソッドから静的フィールドに書き込む」findbugs警告を修正する最良の方法は何ですか?

  20. 20

    リストを返すフィクスチャを使用してpytest関数をパラメータ化する最良の方法は何ですか?

  21. 21

    モデルとアクションをMVCパターンのクラスに分割するための最良のアプローチは何ですか

  22. 22

    オーバーライドする実装でメソッドのインターフェイスのデフォルト実装を呼び出す方法は?

  23. 23

    ggplotに1000の回帰直線を追加する最良の方法は何ですか?(モデルベースのブートストラップ)

  24. 24

    別のメソッドを呼び出すだけのメソッドをテストカバーするための最良の方法は何ですか?

  25. 25

    Laravel Eloquent:関係(メソッド)でパラメーターを渡す際の最良の方法は何ですか、またその違いは何ですか

  26. 26

    Swiftでパスワードを暗号化するための最良の方法は何ですか?

  27. 27

    NPMパッケージをステップスルーするための最良の方法は何ですか

  28. 28

    中断信号でサーバーのストップアクションを実装するための最良の方法は何ですか?

  29. 29

    ユーザースキルメソッドを実装するための最良の方法-Rails4

ホットタグ

アーカイブ