Go言語における多態性の仕組み

Go言語では、ポリモーフィズムを実装するためにインターフェースを使用できます。ポリモーフィズムとは、同じインターフェースを異なる型で実装でき、実際の型に応じて異なるメソッドを呼び出せることを意味します。

多態を実現するには、まずインターフェースを定義する必要があります。インターフェースとは、メソッドの集合を定義したもので、そのメソッドを実装した任意の型はそのインターフェースの実装であるとみなされます。

インターフェイスの定義は以下のようなものです。

type Shape interface {
    Area() float64
    Perimeter() float64
}

次に、このインターフェースを実装するために、別々のタイプを定義することができます。例えば、長方形のタイプと、円のタイプを定義できます。

type Rectangle struct {
    width  float64
    height float64
}

func (r Rectangle) Area() float64 {
    return r.width * r.height
}

func (r Rectangle) Perimeter() float64 {
    return 2 * (r.width + r.height)
}

type Circle struct {
    radius float64
}

func (c Circle) Area() float64 {
    return math.Pi * c.radius * c.radius
}

func (c Circle) Perimeter() float64 {
    return 2 * math.Pi * c.radius
}

これにより、Rectangle と Circle は Shape インターフェイスの 2 つのメソッド、Area と Perimeter の両方をネイティブで実装したことになります。

また、Shapeインターフェイスを実装したこれらの型は、多相呼び出しに適用できます。たとえば、Shapeの領域を計算する関数を定義します。

func PrintArea(s Shape) {
    fmt.Println("Area:", s.Area())
}

次に Rectangle型と Circle型のインスタンスをこの関数に渡してそれぞれ呼び出すことができる。

r := Rectangle{width: 5, height: 3}
c := Circle{radius: 2}

PrintArea(r) // 输出: Area: 15
PrintArea(c) // 输出: Area: 12.566370614359172

PrintArea関数を呼び出すとき、引数には、Shapeインターフェースを実装したどの型でも可能で、これが多態性の現れです。実際の型に応じて、対応する型のメソッドが呼び出されます。

bannerAds