2014-09-26 3 views
2
  1. 이동 중에 가상 상속을 실현하는 방법은 무엇입니까?go lang의 가상 상속은 무엇입니까?

  2. go lang 컴파일러 버전 : "1.3.1 windows/amd64", go lang의 "가상 상속"을 지원합니까?

"가상"을 지원할 수있는 C 언어는 들어 본 적이 없기 때문에 나는 정말로 오해하고 있습니다.

+0

예, C의 개념 ++.하지만 난 그것을 지원할 수있는 이동 누군가에게서들은 같은 것입니다. 나는 그것에 대해 들어 본 적이 없었습니다. @ nos –

+0

소년, 그것은 복잡합니다. 사람들은 C++에서 [타입 임베딩] (http://golang.org/ref/spec#Struct_types) ("익명 유형"을 찾습니다) 및 [인터페이스 (http :// /golang.org/ref/spec#Interface_types) 또는 그 조합. – twotwotwo

답변

9

Virtual Inheritance 다중 상속이없는 경우 존재하지 않는 a problem을 해결합니다. D의 회원이 말했다에 액세스 할 때 클래스 B와 C는 모두 다음 같은 이름의 데이터 멤버 (또는 그 문제에 대한 방법)를 제공하는 경우

A 
/\ 
B C 
\/
    D 

, 당신은 누구 명확하게 할 수있는 방법이 필요 다음 상속 트리를 고려 액세스하려는 조상의 데이터 멤버 (또는 메소드).

가상 상속은 C++의 솔루션입니다.

처음에는 상속이 없습니다. 당신은 한 번에 주어진 유형의 구성원을 최대 1 명까지 포함시킬 수 있습니다.

http://play.golang.org/p/1iYzdoFqIC

package main 

type B struct { 
} 

func (b B) Foo() {} 

type C struct { 
} 

func (c C) Foo() {} 

type D struct { 
    B 
    C 
} 

func main() { 
    d := D{B{}, C{}} 
    // d.Foo() // <- ambiguous 
    d.B.Foo() // <- ok 
    d.C.Foo() // <- ok 
} 
+0

이제 "상속"과 "가상 상속"개념에 대해 더 잘 이해하게되었습니다. 그리고 이동에 대해서도 마찬가지입니다. 정말 고맙습니다. –

+0

정확히 ...이 문제는 [공칭 하위 유형 지정] (https://en.wikipedia.org/wiki/Nominal_type_system)이있는 언어에만 관련이 있습니다. Go는 객체 지향 언어가 아니므로 해결하려는 가상 상속 문제는 적절하지 않습니다. –

0

"가상 상속은"더이

http://play.golang.org/p/8RvPmB3Pof

package main 

type A struct { 
    virtual int 
} 

func (a *A) set(v int) { 
    a.virtual = v 
} 

func (a *A) get() int { 
    return a.virtual 
} 

type B struct { 
    *A 
} 

type C struct { 
    *A 
} 

type D struct { 
    *B 
    *C 
} 

func main() { 
    a := &A{} 
    b := &B{a} 
    c := &C{a} 
    d := &D{b, c} 
    d.B.set(3) 
    println(d.C.get()) 
    return 
}