Ich schreibe ein Spiel in go. In C ++ würde ich alle meine Entitätsklassen in einem Array der BaseEntity-Klasse speichern. Wenn sich eine Entität in der Welt bewegen müsste, wäre dies eine PhysEntity, die von einer BaseEntity abgeleitet ist, jedoch zusätzliche Methoden enthält. Ich habe versucht, dies nachzuahmen.
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())
}
Dies wird nicht kompiliert, da es nicht sagen kann, dass 'Entität' eine PhysEntity war. Was ist eine geeignete Alternative zu dieser Methode?
invalid type assertion .. (non-interface type .. on left)
Insbesondere enthält der Go-Typ "interface" die Informationen darüber, was das Objekt wirklich war, das von der Schnittstelle übergeben wurde. Daher ist das Casting viel billiger als ein C ++ dynamic_cast oder der entsprechende Java-Test-and-Cast.
quelle