반응형
보다 전문화 된 인터페이스로 다시 캐스팅
이동 중에 게임을 작성하고 있습니다. C ++에서는 모든 엔티티 클래스를 BaseEntity 클래스의 배열에 저장합니다. 엔티티가 세계에서 이동해야하는 경우 BaseEntity에서 파생되지만 메서드가 추가 된 PhysEntity가됩니다. 나는 이것을 모방하려고 시도했다.
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())
}
특히 Go "인터페이스"유형은 인터페이스에 의해 전달 된 객체가 실제로 무엇인지에 대한 정보를 가지고 있으므로 C ++ dynamic_cast 또는 이에 상응하는 Java 테스트 및 캐스트보다 캐스팅하는 것이 훨씬 저렴합니다.
참고 URL : https://stackoverflow.com/questions/4799905/casting-back-to-more-specialised-interface
반응형
'program tip' 카테고리의 다른 글
Qt Creator 색 구성표 (0) | 2020.11.05 |
---|---|
자바 동시성 : CAS 대 잠금 (0) | 2020.11.05 |
w3wp.exe 란 무엇입니까? (0) | 2020.11.05 |
php artisan migrate : make create_mytable 실패 : "migrate : make"가 정의되지 않았습니다. (0) | 2020.11.04 |
String.format ()에 대한 Java의 % ld에 해당하는 C ++ (0) | 2020.11.04 |