github.com/searKing/golang/go@v1.2.74/util/class/class.go (about) 1 // Copyright 2020 The searKing Author. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package class 6 7 // Classer is an interface to enhance go's embed struct with virtual member function in C++|Java 8 // It's used like this: 9 //import "github.com/searKing/golang/go/util/class" 10 //type Pet struct { 11 // class.Class 12 //} 13 // 14 //func (pet *Pet) Name() string { 15 // return "pet" 16 //} 17 // 18 //func (pet *Pet) VirtualUpperName() string { 19 // p := pet.GetDerivedElse(pet).(Peter) 20 // return strings.ToUpper(p.Name()) 21 //} 22 // 23 //func (pet *Pet) UpperName() string { 24 // return strings.ToUpper(pet.Name()) 25 //} 26 // 27 ////Dog derived from Pet 28 //type Dog struct { 29 // Pet 30 //} 31 // 32 //func NewDogEmbedded() *Dog { 33 // return &Dog{} 34 //} 35 // 36 //func NewDogDerived() *Dog { 37 // dog := &Dog{} 38 // dog.SetDerived(dog) 39 // return dog 40 //} 41 // 42 //func (dog *Dog) Name() string { 43 // return "dog" 44 //} 45 type Classer interface { 46 GetDerived() Classer 47 GetDerivedElse(defaultClass Classer) Classer 48 SetDerived(derived Classer) 49 } 50 51 type Class struct { 52 derived Classer 53 } 54 55 func NewClass() *Class { 56 return &Class{} 57 } 58 59 // GetDerived returns actual outermost struct 60 func (task Class) GetDerived() Classer { 61 return task.derived 62 } 63 64 // GetDerivedElse returns actual outermost struct if it is non-{@code nil} and 65 // otherwise returns the non-{@code nil} argument. 66 func (task Class) GetDerivedElse(defaultClass Classer) Classer { 67 if task.derived == nil { 68 return defaultClass 69 } 70 return task.derived 71 } 72 73 // SetDerived updates actual outermost struct 74 func (task *Class) SetDerived(derived Classer) { 75 task.derived = derived 76 }