zur Einführung in den Polymorphismus in GO-no-Schnittstellen. Ich hoffe, es wird Freunden, die es benötigen, hilfreich sein!
Wenn Sie Polymorphismus in Polymorphismus in Go analysieren – keine Schnittstellen erforderlich verwenden möchten, aber keine Schnittstellen mögen? Lesen Sie weiter...Lass uns zunächst sehen, was wir machen wollen:
var dog, duck *Animal dog = NewDog("fido") duck = NewDuck("donald") fmt.Println(dog.makeNoise()) // fido says woof! fmt.Println(duck.makeNoise()) // donald says quack!
Hund
und Ente
haben den gleichen Typ (*Animal). Jede Variable wird mit einem anderen Konstruktor instanziiert und verhält sich unterschiedlich, wenn dieselbe Methode aufgerufen wird.
Normalerweise verwenden wir die Schnittstelle für dieses Beispiel, aber wir möchten nicht, dass die tatsächliche Verwendung so einfach ist.
Sehen wir uns an, wie das funktioniert: dog
和duck
具有相同的类型(*Animal
)。每个变量都使用不同的构造函数实例化,并且在makeNoise
调用相同方法时它们具有不同的行为 。
通常,这个例子是我们使用接口的目的,但我们不希望实际使用是这么简单。
让我们看看如何使这项工作:
请点击这里(https://play.golang.org/p/P5Ovn_K-yyo)查看完整的代码
type Animal struct { makeNoiseFn func(*Animal) string name string legs int }
该Animal
结构体包含name
和legs
属性,以及一个mkeNoiseFn
属性,这个属性实际上是一个函数,函数接受一个*Animal
参数并返回一个字符串。
func (a *Animal) makeNoise() string { return a.makeNoiseFn(a) }
makeNoise
方法实际上只是一个包装器,该包装器调用相应的动物makenoiseFn
,并将指向动物本身的指针作为其参数。
func NewDog(name string) *Animal { return &Animal{ makeNoiseFn: func(a *Animal) string { return a.name + " says woof!" }, legs: 4, name: name, } } func NewDuck(name string) *Animal { return &Animal{ makeNoiseFn: func(a *Animal) string { return a.name + " says quack!" }, legs: 4, name: name, } }
现在,我们要做的就是让同一个类型表现出不同的行为,并为其makeNoiseFn
属性分配不同的功能 。现在,该makeNoise
Bitte klicken Sie hier (https://play.golang.org/p/P5Ovn_K-yyo), um den vollständigen Code zu sehentype Animal interface { makeNoise() string } type Dog struct { name string legs int } func (d *Dog) makeNoise() string { return d.name + " says woof!" } type Duck struct { name string legs int } func (d *Duck) makeNoise() string { return d.name + " says quack!" } func NewDog(name string) Animal { return &Dog{ legs: 4, name: name, } } func NewDuck(name string) Animal { return &Duck{ legs: 4, name: name, } } func main() { var dog, duck Animal dog = NewDog("fido") duck = NewDuck("donald") fmt.Println(dog.makeNoise()) // fido says woof! fmt.Println(duck.makeNoise()) // donald says quack! }Nach dem Login kopierenThe
rrreeeAnimal Die Struktur enthält die Attribute <code>name
undlegs
sowie einmkeNoiseFn
-Attribut. Dieses Attribut ist eigentlich eine Funktion, die ein *AnimalParameter und gibt eine Zeichenfolge zurück. rrreee DiemakeNoise
-Methode ist eigentlich nur ein Wrapper, der das entsprechende TiermakenoiseFn
aufruft und als Argument einen Zeiger auf das Tier selbst verwendet.Jetzt müssen wir nur noch dafür sorgen, dass sich derselbe Typ anders verhält und seinem
Nein!makeNoiseFn
-Attribut unterschiedliche Funktionen zuweisen. Nun ruft die MethodemakeNoise
die entsprechende Funktion auf, je nachdem, ob es sich bei dem Tier um einen Hund oder eine Ente handelt. Soll ich das tun?Dieser Beitrag soll Ihnen zeigen, was Sie tun können, nicht was Sie tun sollten. Wenn Sie Polymorphismus implementieren müssen, sind Schnittstellen ein besserer Ansatz. Wenn Schnittstellen verwendet werden, würde dieser Code so aussehen:Originaladresse: https://www.sohamkamani.com/golang/2019-03-29-polymorphism-without-interfaces/🎜🎜Übersetzungsadresse: https:/ /learnku.com/go/t/52404🎜🎜rrreee
Das obige ist der detaillierte Inhalt vonPolymorphismus in Go analysieren – keine Schnittstellen erforderlich. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!