2011-01-25 17 views
36

Oyunda bir yazı yazıyorum. C++ 'da bütün varlık sınıflarım bir BaseEntity sınıfı dizisinde saklardım. Eğer bir varlık, dünyada hareket etmek için gerekliyse, bir BaseEntity'den elde edilen bir Fiziksel, ama eklenmiş yöntemler olacaktır. o varlık "bir PhysEntity olduğunu söyleyemem gibi bu derlenmeyecektirDaha fazla özel arayüze geri dönün

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

: Bunu taklit etmeye çalıştı gitmektir. Bu yönteme uygun alternatif nedir?

cevap

59

type assertion'u kullanın. Örneğin,

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

Türü onaylamaların kullanımı pahalı olup olmadığını biliyor musunuz? BaseEntity'de bir değişkenin türünü takip etmeme değecek mi? –

+4

tip iddiaları ucuzdur. – rog

+0

Bunu denediğimde, bir hata alıyorum: "geçersiz tür onaylama .. (arabirim dışı .. .. solda)" – Zac

5

Özellikle, git "arabirim" tipi böylece bir C++ dynamic_cast veya dengi java Testi-daha ucuzdur döküm, arayüzü tarafından kabul edildi, nesne gerçekte ne dair bilgi ve-alçı.

İlgili konular