☆decorator↑
package main
import "fmt"
type staff struct {
payment float;
}
type employee interface {
getOvertimePay() float;
}
func showOvertimePay(e employee, name string) {
fmt.Printf("%s: I'm getting %f yen. Haha!\n",
name, e.getOvertimePay()
);
}
func (self *staff) getOvertimePay() float {
return self.payment;
}
type beTechnical struct {
prototype employee;
}
func (self *beTechnical) getOvertimePay() float {
return self.prototype.getOvertimePay() * 1.1;
}
type beLicensed struct {
prototype employee;
}
func (self *beLicensed) getOvertimePay() float {
return self.prototype.getOvertimePay() * 1.2;
}
type beManager struct {
prototype employee;
}
func (self *beManager) getOvertimePay() float {
return 0;
}
type beTemporary struct {
prototype employee;
}
func (self *beTemporary) getOvertimePay() float {
return 1000;
}
func main() {
john := &beTechnical{&beLicensed{&staff{1000}}};
showOvertimePay(john, "John");
elen := &beTemporary{&beTechnical{&staff{1000}}};
showOvertimePay(elen, "Elen");
}