そもそも抽象化とは
- 具体的な実装を隠し振る舞いによって共通化させること
- 複数の実装を同質のものとして扱う
インターフェースによる抽象化とは
- 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)
}