Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "fmt"
- )
- type RI interface {
- Create(in interface{}) interface{}
- Get(in interface{}) interface{}
- Update(in interface{}) interface{}
- Delete(in interface{}) interface{}
- }
- type R struct{}
- func (r *R) Create(in interface{}) interface{} { return "R Create" }
- func (r *R) Get(in interface{}) interface{} { return "R Get" }
- func (r *R) Update(in interface{}) interface{} { return "R Update" }
- func (r *R) Delete(in interface{}) interface{} { return "R Delete" }
- type RA struct{
- RI
- }
- func (r *RA) Create(in interface{}) interface{} { return "RA Create" }
- func (r *RA) Custom(in interface{}) interface{} { return "RA Custom" }
- func newRA() *RA {
- return &RA{RI: &R{}}
- }
- type SI interface {
- getR() RI
- Create(in interface{}) interface{}
- Get(in interface{}) interface{}
- Update(in interface{}) interface{}
- Delete(in interface{}) interface{}
- }
- type S struct {
- RI
- }
- func (s *S) getR() RI { return s.RI }
- func (s *S) Create(in interface{}) interface{} { return "S Create " + s.RI.Create(in).(string) }
- func (s *S) Get(in interface{}) interface{} { return "S Get " + s.RI.Get(in).(string) }
- func (s *S) Update(in interface{}) interface{} { return "S Update " + s.RI.Update(in).(string) }
- func (s *S) Delete(in interface{}) interface{} { return "S Delete " + s.RI.Delete(in).(string) }
- func newS(r RI) *S {
- if r == nil {
- r = &R{}
- }
- return &S{RI: r}
- }
- type SA struct {
- SI
- }
- func (s *SA) Create(in interface{}) interface{} { return "SA Create " + s.SI.getR().Create(in).(string) }
- func newSA() *SA {
- return &SA{SI: newS(newRA())}
- }
- type SB struct {
- SI
- }
- func (s *SB) Get(in interface{}) interface{} { return "SB Get " + s.SI.getR().Create(in).(string) }
- func newSB() *SB {
- return &SB{SI: newS(nil)}
- }
- type SC struct {
- SI
- }
- func (s *SC) Delete(in interface{}) interface{} { return "SC Delete " + s.SI.getR().Create(in).(string) }
- func newSC() *SC {
- return &SC{SI: newS(nil)}
- }
- func process(s SI) {
- fmt.Println(s.Create(123))
- fmt.Println(s.Get(123))
- fmt.Println(s.Update(123))
- fmt.Println(s.Delete(123))
- }
- func main() {
- process(newSA())
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement