Go 메소드 재정의: 상속과 유사한 동작 달성
Go에서는 전통적인 객체지향 프로그래밍 의미의 메소드 재정의가 직접 지원되지 않습니다. . 그러나 유사한 기능을 허용하는 기술이 있습니다. 인터페이스 및 익명 내장 구조체를 활용하여 메서드 재정의 동작을 에뮬레이션할 수 있습니다.
문제 이해
Get으로 기본 유형 Base를 정의하는 다음 코드 조각을 고려하세요. () 메서드와 Get()의 결과를 간단히 반환하는 GetName() 메서드.
type Base struct { } func (base *Base) Get() string { return "base" } func (base *Base) GetName() string { return base.Get() }
목표는 기존 Base 유형의 기능을 유지하면서 Get() 구현을 재정의하는 새 유형을 만드는 것입니다. .
익명 임베딩 사용
메소드 재정의를 에뮬레이트하는 한 가지 접근 방식은 익명 임베딩을 사용하는 것입니다. Base 유형을 포함하는 새 유형 정의:
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
익명 포함은 기본적으로 포함된 Base 유형의 복사본이고 새 Get() 메서드는 별도의 개체에 정의되므로 이 메서드는 작동하지 않습니다. copy.
인터페이스 활용 및 임베딩
상속과 유사한 동작을 달성하기 위한 보다 관용적인 Go 접근 방식은 인터페이스와 임베딩을 사용하는 것입니다. 이를 수행할 수 있는 방법은 다음과 같습니다.
type Getter interface { Get() string }
type Base struct { Getter } func (base *Base) Get() string { return "base" }
type Sub struct { Base } func (sub *Sub) Get() string { return "Sub" }
func (sub *Sub) GetName() string { return sub.Base.GetName(sub) }
이 접근 방식을 활용하면 Sub 유형은 Base의 전체 기능을 계속 유지하면서 Get() 메서드를 재정의할 수 있습니다. 유형. 재정의된 메서드는 Getter 인터페이스를 통해 명시적으로 호출할 수 있으므로 수신자 유형에 따라 적절한 메서드 디스패치가 보장됩니다.
위 내용은 직접적인 지원 없이 Go에서 메서드 재정의를 어떻게 에뮬레이션할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!