본문 바로가기

Golang

내장과 상속은 다르다

내장은 구조체를 다른 구조체 안에 내장하는 방법이고 상속과는 별개이다 
 
예제코드를 보면 Bark 메서드를 오버라이드를 하여 상속한것처럼 보이지만  Dog객체를 인수로 받는  DogVoice메서드에 다른 객체인 BullDog, ShibaInu객체를 변수로 대입할 수 없다. 왜냐하면 내장은 상속과 다르기 때문이다.

package main

import "fmt"

type Dog struct{}

func (d *Dog) Bark() string {return "Bow"}

type BullDog struct{Dog}
type ShibaInu struct{Dog}

/*오버라이드*/
func (s *ShibaInu) Bark() string {return "멍"}

/*Dog객체를 인수로 받아 나중에 DogVoice()메서드가 호출될때 다른 객체의 인자를 받지 못한다*/
func DogVoice(d *Dog) string {return d.Bark()}

func main() {
	bd := &BullDog{}
	fmt.Println(bd.Bark())
	si := &ShibaInu{}
	fmt.Println(si.Bark())
    /*Error*/
	fmt.Println(DogVoice(si))
}

 
 
내장은 다형성,공변성,반공변성을 충족하지 못해 에러가 출력된다. 사진을 보면 다른 객체를 넣으니 에러가 뜬다.
에러 내용: cannot use si (variable of type *ShibaInu) as *Dog value in argument to DogVoicecompilerIncompatibleAssign

ShibaInu객체 si는 Dog객체를 인수로 받는 메서드에 변수로 대입할 수 없다.

 

https://m.yes24.com/Goods/Detail/124624242

Go 언어로 배우는 웹 애플리케이션 개발 - 예스24

베테랑 고퍼가 알려주는 Go 언어 핸즈온 가이드Go 언어로 REST API 웹 애플리케이션을 개발할 때 반드시 알아야 할 지식을 알려준다. 전반부에는 웹 애플리케이션을 개발하기 전에 알아야 할 Go 언

m.yes24.com

'Golang' 카테고리의 다른 글

채널 SELECT 활용  (0) 2024.02.16