인터페이스의 핵심은 구조체의 인스턴스들을 이용하여 메소드를 처리하도록 한다.
인터페이스 안의 메소드를 구조체의 메소드로 정의시 그 안에 정의된 것을 다 정의해야 한다.
구조체는 인터페이스에 있는 메소드보다 더 많은 것을 정의할 수 있다.
인터페이스를 이용하여 인스턴스를 생성하고 리턴값으로 인터페이스로 전달하여 동일한 인터페이스로 실질적인 구조체들을 처리한다.
package main
import (
"fmt"
)
"fmt"
)
type sayer interface {
say()
}
say()
}
type AA struct{
name string
}
name string
}
func (this *AA) say(){
fmt.Println("==========>AA")
fmt.Println("this name ", this.name)
}
type BB struct{
*AA
age int
}
func (this *BB) say(){
fmt.Println("==========>BB")
fmt.Println(" this name ", this.name)
fmt.Println(" this age ", this.age)
}
fmt.Println("==========>AA")
fmt.Println("this name ", this.name)
}
type BB struct{
*AA
age int
}
func (this *BB) say(){
fmt.Println("==========>BB")
fmt.Println(" this name ", this.name)
fmt.Println(" this age ", this.age)
}
// 리턴값으로 인터페이스 타입으로 전달한다.
// 인터페이스 가 구조체를 참조하여 구조체의 메소드들을 호출하여 처리
func ObjectFactory(typeNum int) sayer {
if typeNum ==1 {
obj1 := new(AA)
obj1.name = "dahl"
return obj1
}else{
obj2 := new(BB)
obj2.AA = new(AA)
obj2.AA.name = "moon"
obj2.age = 49
return obj2
}
}
if typeNum ==1 {
obj1 := new(AA)
obj1.name = "dahl"
return obj1
}else{
obj2 := new(BB)
obj2.AA = new(AA)
obj2.AA.name = "moon"
obj2.age = 49
return obj2
}
}
func main() {
obj1 := ObjectFactory(1)
obj1.say()
obj2 := ObjectFactory(0)
obj2.say()
}
obj1 := ObjectFactory(1)
obj1.say()
obj2 := ObjectFactory(0)
obj2.say()
}
댓글
댓글 쓰기