73 votes

Retour à une interface plus spécialisée

Je suis en train d'écrire un jeu en go. En C++, je stocke toutes mes classes d'entités dans un tableau de la classe BaseEntity. Si une entité devait se déplacer dans le monde, elle serait une PhysEntity, qui est dérivée d'une BaseEntity, mais avec des méthodes supplémentaires. J'ai essayé d'imiter cela dans 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())
}

Cela ne compilera pas car il ne pourra pas dire que 'entity' était une PhysEntity. Quelle est une alternative appropriée à cette méthode ?

120voto

peterSO Points 25725

Utilisez un affirmation de type . Par exemple,

original, ok := entity.(PhysEntity)
if ok {
    println(original.b())
}

7voto

weregamer Points 71

Plus précisément, le type "interface" de Go contient les informations sur ce qu'était réellement l'objet, qui a été transmis par l'interface, de sorte que le casting est beaucoup moins coûteux qu'un dynamic_cast en C++ ou que le test-and-cast équivalent en Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X