>백엔드 개발 >Golang >객체 상속 없이 Go에서 다형성을 어떻게 구현할 수 있나요?

객체 상속 없이 Go에서 다형성을 어떻게 구현할 수 있나요?

DDD
DDD원래의
2024-11-15 12:48:02230검색

How Can Go Implement Polymorphism Without Object Inheritance?

Go의 다형성 이해

객체가 다른 형태를 취하는 능력인 다형성은 Go에서 인터페이스를 통해 구현됩니다.

문제:

거래를 나타내는 BaseTX 구조체와 RewardTX 및 AllowanceTX라는 두 가지 특수 거래 유형이 있는 가상 시나리오를 생각해 보세요. AllowanceTX는 BaseTX를 확장하여 추가 필드를 추가합니다. 작업은 두 트랜잭션 유형 모두에서 작동하고 json.Marshal()을 사용하여 해당 데이터를 직렬화하고 저장하는 함수를 구현하는 것입니다. 그러나 현재 구현에서는 AllowanceTX의 추가 필드를 생략하고 BaseTX 구조체의 필드만 직렬화합니다.

Modern Go의 접근 방식은 다음과 같습니다.

Go는 기존 방식을 지원하지 않습니다. 다형성을 위해 인터페이스에만 의존하는 객체 상속. 이 문제를 해결하려면 다음 대체 구현을 고려하십시오.

type TXapi interface {
    logicAndSaveTX()
}

type Metadata struct {
    Field1 string
    Field2 string
}

type RewardTX struct {
    Metadata
}

func (tx RewardTX) logicAndSaveTX() {
    // Logic to overwrite or modify `Metadata` fields ...
    fmt.Printf("saved this object: %+v \n", tx)
}

type AllowanceTX struct {
    Metadata
    AddField string
}

func (tx AllowanceTX) logicAndSaveTX() {
    // Logic to overwrite or modify `Metadata` fields ...
    // Additional logic for `AddField` ...
    fmt.Printf("saved this object: %+v \n", tx)
}

이 접근 방식에서 메타데이터는 독립형 구조체가 되어 각 RewardTX 또는 AllowanceTX 유형 내에 포함된 메타데이터 필드에 대한 특수 동작을 허용합니다. logicAndSaveTX() 메서드는 이제 각 유형에서 구체적으로 작동하여 공통 필드와 고유 필드를 모두 적절하게 처리합니다.

Go의 다형성은 인터페이스를 통해 달성되며 유사한 동작을 가진 다양한 객체 유형을 처리하는 유연하고 효율적인 방법을 제공합니다. 이러한 접근 방식을 수용하면 기존 상속의 한계를 피하고 Go 인터페이스 기반 디자인의 장점을 최대한 활용할 수 있습니다.

위 내용은 객체 상속 없이 Go에서 다형성을 어떻게 구현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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