そもそも抽象化とは

    • 具体的な実装を隠し振る舞いによって共通化させること

 

    複数の実装を同質のものとして扱う

インターフェースによる抽象化とは

    • Goではインターフェースでしか抽象化することができない

interface はメソッドの集合を抽象化したもの

interface は異なる具象型(concrete type)を同じように取り扱うことを可能にしてくれる抽象型(abstract type)

インターフェース

    • Goのインタフェースは,その型がどのようなメソッドを実装するべきかを規定する役割を持つ

型TがインターフェースIを実装しているとは

インターフェースで定義されているメソッドを全て持つ

型TはインターフェースI型として振る舞うことができる

var i I = t // tはT型の変数とする

インターフェースの例

    • インターフェースはメソッドの集まり

メソッドのリストがインターフェースで規定しているものと一致する型はインターフェースを実装していることになる

package main

import "fmt"

// バスケをするためのインターフェース
type BasketBaller interface {
    Run()
    Dunk()
    Jump()
    Shoot()
}

// 人間と犬の構造体
type Human struct {
    Height int
    Weight int
}
type Dog struct {
    Kind string
}

// 人間のインターフェースの実装
func (h Human) Run() {
    fmt.Printf("身長: %v, 体重:%v, の選手が走るよ\n", h.Height, h.Weight)
}
func (h Human) Dunk() {
    fmt.Printf("身長: %v, 体重:%v, の選手がダンクをするよ\n", h.Height, h.Weight)
}
func (h Human) Jump() {
    fmt.Printf("身長: %v, 体重:%v, の選手がジャンプをするよ\n", h.Height, h.Weight)
}
func (h Human) Shoot() {
    fmt.Printf("身長: %v, 体重:%v, の選手がシュートするよ\n", h.Height, h.Weight)
}

// 犬のインターフェースの実装
func (d Dog) Run() {
    fmt.Printf("犬(%v)が走るよ\n", d.Kind)
}
func (d Dog) Dunk() {
    fmt.Printf("犬(%v)はダンクをできないよ\n", d.Kind)
}
func (d Dog) Jump() {
    fmt.Printf("犬(%v)がジャンプをするよ\n", d.Kind)
}
func (d Dog) Shoot() {
    fmt.Printf("犬(%s)はシュートができないよ\n", d.Kind)
}

// BasketBallerインターフェースが引数になる、Basketメソッド
func Basket(b BasketBaller) {
    b.Dunk()
    b.Jump()
    b.Run()
    b.Shoot()
}

func main() {
    var human = Human{170, 64}
    var dog = Dog{Kind: "プードル"}
    var basketBaller BasketBaller

    basketBaller = human // Human型をBasketBaller型に
    Basket(basketBaller)

    basketBaller = dog // Dog型をBasketBaller型に
    Basket(basketBaller)
}

bannerAds