동일한 메소드 서명으로 다중 인터페이스 구현
Go에서 인터페이스는 유형 안전성을 제공하고 다중 상속을 지원합니다. 그러나 서로 다른 패키지에 정의된 두 인터페이스가 동일한 메서드 서명을 공유하는 경우 단일 구현으로 두 인터페이스를 모두 구현하면 불일치가 발생할 수 있습니다.
이 문제를 해결하기 위해 Go 프로그래밍 언어는 인터페이스를 구현할 때 메서드 유형의 일관성을 강제합니다. 이렇게 하면 명확성이 보장되고 잠재적인 혼란이 줄어듭니다.
제공된 시나리오에서는 동일한 C.Do 메서드를 사용하여 A.Doer 및 B.Doer 인터페이스를 모두 구현하려고 합니다. C.Do는 A.Doer의 요구 사항을 충족하지만 B.Doer에서 기대하는 논리를 준수하지 않을 수 있습니다.
한 가지 해결책은 유형 어설션을 활용하는 것입니다. 객체가 A.Doer와 B.Doer를 모두 만족하는지 확인하면 어떤 구현을 사용할지 결정할 수 있습니다.
<code class="go">if _, ok := obj.(A.Doer); ok { // Use A.Doer implementation } if _, ok := obj.(B.Doer); ok { // Use B.Doer implementation }</code>
그러나 A.Do와 B.Do의 논리가 크게 다른 경우에는 강력한 접근 방식은 개체에 대해 별도의 래퍼를 만드는 것입니다.
각각 C 개체를 포함하고 각각 A.Doer 또는 B.Doer를 구현하는 두 가지 새로운 유형 DoerA 및 DoerB를 만듭니다. 해당 함수에 적절한 래퍼를 전달하면 예상되는 논리가 구현되었는지 확인할 수 있습니다.
<code class="go">type DoerA struct { C C } // Implement A.Do() using C.Do() func (d DoerA) Do() string { return "C now implements A as per its logic" } type DoerB struct { C C } // Implement B.Do() using C.Do() func (d DoerB) Do() string { return "C now implements B as per its logic" } func main() { c := C(0) dA := DoerA{C: c} dB := DoerB{C: c} A.FuncA(dA) B.FuncB(dB) }</code>
별도의 래퍼를 사용하면 기본 C를 계속 활용하면서 각 인터페이스 메서드에 대해 올바른 구현을 적용할 수 있습니다. 개체입니다.
위 내용은 Go에서 동일한 메소드 서명을 사용하여 다중 인터페이스를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!