Heim  >  Artikel  >  Backend-Entwicklung  >  Polymorphismus in Go analysieren – keine Schnittstellen erforderlich

Polymorphismus in Go analysieren – keine Schnittstellen erforderlich

藏色散人
藏色散人nach vorne
2020-12-10 13:49:511805Durchsuche

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...

Polymorphismus in Go analysieren – keine Schnittstellen erforderlichLass 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: dogduck具有相同的类型(*Animal)。每个变量都使用不同的构造函数实例化,并且在makeNoise调用相同方法时它们具有不同的行为 。

通常,这个例子是我们使用接口的目的,但我们不希望实际使用是这么简单。

让我们看看如何使这项工作:

请点击这里(https://play.golang.org/p/P5Ovn_K-yyo)查看完整的代码

type Animal struct {
    makeNoiseFn func(*Animal) string
    name        string
    legs        int
}

Animal结构体包含namelegs属性,以及一个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 sehen

type 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!
}

TheAnimal Die Struktur enthält die Attribute <code>name und legs sowie ein mkeNoiseFn-Attribut. Dieses Attribut ist eigentlich eine Funktion, die ein *AnimalParameter und gibt eine Zeichenfolge zurück. rrreee Die makeNoise-Methode ist eigentlich nur ein Wrapper, der das entsprechende Tier makenoiseFn aufruft und als Argument einen Zeiger auf das Tier selbst verwendet.

rrreee

Jetzt müssen wir nur noch dafür sorgen, dass sich derselbe Typ anders verhält und seinem makeNoiseFn-Attribut unterschiedliche Funktionen zuweisen. Nun ruft die Methode makeNoise die entsprechende Funktion auf, je nachdem, ob es sich bei dem Tier um einen Hund oder eine Ente handelt. Soll ich das tun?

Nein!

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:

rrreee

Originaladresse: https://www.sohamkamani.com/golang/2019-03-29-polymorphism-without-interfaces/🎜🎜Übersetzungsadresse: https:/ /learnku.com/go/t/52404🎜🎜

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen