>  기사  >  백엔드 개발  >  직접적인 지원 없이 Go에서 메서드 재정의를 어떻게 에뮬레이션할 수 있나요?

직접적인 지원 없이 Go에서 메서드 재정의를 어떻게 에뮬레이션할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-10 01:08:02979검색

How can you emulate method overriding in Go without direct support?

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 접근 방식은 인터페이스와 임베딩을 사용하는 것입니다. 이를 수행할 수 있는 방법은 다음과 같습니다.

  1. 인터페이스 정의: Get() 메서드를 정의하는 Getter라는 인터페이스를 만듭니다.
type Getter interface {
    Get() string
}
  1. 인터페이스 포함: 기본 유형에 Getter 인터페이스 포함:
type Base struct {
    Getter
}

func (base *Base) Get() string {
    return "base"
}
  1. 새 유형 정의: 만들기 Base 유형을 포함하고 Getter 인터페이스를 구현하는 새로운 유형:
type Sub struct {
    Base
}

func (sub *Sub) Get() string {
    return "Sub"
}
  1. 재정의된 메서드 호출: Sub 유형에서 재정의된 Get( ) Getter 인터페이스를 사용하여 메서드를 사용하고 *Sub를 수신자로 전달합니다.
func (sub *Sub) GetName() string {
    return sub.Base.GetName(sub)
}

이 접근 방식을 활용하면 Sub 유형은 Base의 전체 기능을 계속 유지하면서 Get() 메서드를 재정의할 수 있습니다. 유형. 재정의된 메서드는 Getter 인터페이스를 통해 명시적으로 호출할 수 있으므로 수신자 유형에 따라 적절한 메서드 디스패치가 보장됩니다.

위 내용은 직접적인 지원 없이 Go에서 메서드 재정의를 어떻게 에뮬레이션할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.