LoginSignup
5
3

More than 1 year has passed since last update.

Golang インターフェースと抽象化

Last updated at Posted at 2020-04-01

そもそも抽象化とは

  • 具体的な実装を隠し振る舞いによって共通化させること
  • 複数の実装を同質のものとして扱う

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

  • Goではインターフェースでしか抽象化することができない
  • interface はメソッドの集合を抽象化したもの
  • interface は異なる具象型(concrete type)を同じように取り扱うことを可能にしてくれる抽象型(abstract type)

インターフェース

  • Goのインタフェースは,その型がどのようなメソッドを実装するべきかを規定する役割を持つ
  • 型TインターフェースIを実装しているとは
    • インターフェースで定義されているメソッドを全て持つ
    • 型TインターフェースI型として振る舞うことができる
      • var i I = t // tはT型の変数とする

インターフェースの例

  • インターフェースはメソッドの集まり
    • メソッドのリストがインターフェースで規定しているものと一致する型はインターフェースを実装していることになる
sample.go
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)
}

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3