06/04/2020 - GO
Bu örnekte, programcıları belirli bir arabirim üzerine kurulu bir yapıyı argüman olarak kullanmaya zorlayacağız. Bu argüman bir kurucuda kullanılacak, ancak bir fonksiyon veya metod ile de kullanılabilir. Bunu yapmamızın nedeni, paketimizin belirli bir yapı türüyle çalışabilmesidir. Yapı alanları ve işlevsellik, arayüzü tatmin ettiği sürece herhangi bir şey olabilir.
Örneğimiz basit. Seçici bir sürücümüz var ve bu sürücü sadece "A" sınıfı araba sürmeyi seviyor. Yine de ona her şeyi vereceğiz!
├── car
│ ├── audi.go
│ └── mercedes.go
├── driver
│ ├── car.go
│ └── driver.go
└── main.go
package driver
type Car interface {
CheckClass(requiredClass string) bool
Make() string
Model() string
}
package driver
import "log"
type Driver struct {
name string
requiredClass string
cars []Car
}
func New(name, requiredClass string, car... Car) Driver {
return Driver{
name: name,
requiredClass: requiredClass,
cars: car,
}
}
func (d Driver) Drive() {
for _, car := range d.cars {
if car.CheckClass(d.requiredClass) {
log.Println(d.name, "will drive", car.Make(), car.Model())
} else {
log.Println(d.name, "won't drive", car.Make(), car.Model())
}
}
}
package car
type Audi struct {
// Class
Cls string
// Model
Mdl string
}
func (c Audi) CheckClass(requiredClass string) bool {
return c.Cls == requiredClass
}
func (c Audi) Make() string {
return "Audi"
}
func (c Audi) Model() string {
return c.Mdl
}
package car
type Mercedes struct {
// Class
Cls string
// Model
Mdl string
}
func (c Mercedes) CheckClass(requiredClass string) bool {
return c.Cls == requiredClass
}
func (c Mercedes) Make() string {
return "Mercedes"
}
func (c Mercedes) Model() string {
return c.Mdl
}
package main
import (
"client/internal/car"
"client/internal/driver"
)
func main() {
merc1 := car.Mercedes{
Cls: "A",
Mdl: "SL500",
}
merc2 := car.Mercedes{
Cls: "C",
Mdl: "D200",
}
audi1 := car.Audi{
Cls: "A",
Mdl: "80",
}
driver.
New("inanzzz", "A", merc1, merc2, audi1).
Drive()
}
2020/04/06 18:01:54 inanzzz will drive Mercedes SL500
2020/04/06 18:01:54 inanzzz won't drive Mercedes D200
2020/04/06 18:01:54 inanzzz will drive Audi 80