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  }