1. ホーム
  2. go

より専門的なインターフェイスへのキャストバック

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())
}