program tip

보다 전문화 된 인터페이스로 다시 캐스팅

radiobox 2020. 11. 5. 07:52
반응형

보다 전문화 된 인터페이스로 다시 캐스팅


이동 중에 게임을 작성하고 있습니다. 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

반응형