より専門的なインターフェイスへのキャストバック
2023-12-02 12:23:26
質問
私はgoでゲームを書いています。C++では、私はBaseEntityクラスの配列にすべてのエンティティクラスを格納します。エンティティが世界で移動する必要がある場合、それはBaseEntityから派生したPhysEntityになりますが、メソッドが追加されています。これを真似てみたのがgoです。
package main
type Entity interface {
a() string
}
type PhysEntity interface {
Entity
b() string
}
type BaseEntity struct { }
func (e *BaseEntity) a() string { return "Hello " }
type BasePhysEntity struct { BaseEntity }
func (e *BasePhysEntity) b() string { return " World!" }
func main() {
physEnt := PhysEntity(new(BasePhysEntity))
entity := Entity(physEnt)
print(entity.a())
original := PhysEntity(entity)
// ERROR on line above: cannot convert physEnt (type PhysEntity) to type Entity:
println(original.b())
}
これは、'entity' が PhysEntity であることを伝えることができないので、コンパイルされません。このメソッドに代わる適切な方法は何ですか?
どのように解決するのですか?
を使用します。 型アサーション . 例えば
original, ok := entity.(PhysEntity)
if ok {
println(original.b())
}
関連
-
[解決済み] reflectを使用して、構造体フィールドの値を設定するにはどうすればよいですか?
-
[解決済み] 複数のファイルからなるGoプログラムをコンパイルするには?
-
[解決済み] チャネルの要素数
-
[解決済み] ...interface{}の意味 (ドット・ドット・ドット・インターフェース)
-
[解決済み] go ウェブサーバーを使って静的な html ファイルを提供するにはどうすればよいですか?
-
[解決済み] gc」と「gccgo」の主な相違点は何ですか?
-
[解決済み] チャンネルを読まずに閉じたかどうかを確認する方法は?
-
[解決済み] Goのintとint64の違いは何ですか?
-
[解決済み] Goでシステムコマンドの出力を得るには?
-
[解決済み] env varが空の場合、どのようにデフォルト値を割り当てるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】データ(型インターフェース{})を文字列に変換できない:型アサーションが必要
-
[解決済み] time.Sleepを使わずにすべてのゴルーチンが終了するのを待つには?
-
[解決済み] スライスを宣言するのか、スライスを作るのか?
-
[解決済み] GoのToString()関数
-
[解決済み] Go で子プロセスの標準出力パイプをリダイレクトする
-
[解決済み] マップを含む値を順番に収集する
-
[解決済み] コンパイルしたファイルのサイズを小さくするには?
-
[解決済み] GoのNull値
-
[解決済み] http.Handleとhttp.HandleFuncの違いとは?
-
go.modの「incompatible」の意味、害はないのか?