Heim >Backend-Entwicklung >Golang >Wie können abstrakte Klassen in Go implementiert werden?

Wie können abstrakte Klassen in Go implementiert werden?

DDD
DDDOriginal
2024-11-29 10:50:11500Durchsuche

How Can Abstract Classes Be Implemented in Go?

Abstrakte Klassen in Go implementieren

Abstrakte Klassen werden in Go nicht nativ unterstützt. Es ist jedoch möglich, das Verhalten abstrakter Klassen zu emulieren, indem ein Ansatz verwendet wird, der Folgendes umfasst:

  1. Definieren einer Schnittstelle mit den gewünschten abstrakten Methoden.
  2. Erstellen eines Typs mit eingebettetem Empfänger, der die erfüllt Schnittstelle und stellt Standardimplementierungen für die bereit Methoden.

Beispiel

Betrachten Sie den folgenden Code, der einen Daemon vom abstrakten Typ mit den Methoden start und doWork definiert:

type Daemon interface {
    start(time.Duration)
    doWork()
}

Um Standardimplementierungen bereitzustellen, können wir einen abstrakten Typ (z. B. AbstractDaemon) erstellen, der die Daemon-Schnittstelle einbettet und Standardimplementierungen für bereitstellt Methoden:

type AbstractDaemon struct {
    Daemon
}

func (a *AbstractDaemon) start(duration time.Duration) {
    ticker := time.NewTicker(duration)

    // this will call daemon.doWork() periodically
    go func() {
        for {
            <-ticker.C
            a.doWork()
        }
    }()
}

Konkrete Typen

Jetzt können wir konkrete Typen erstellen, die vom Typ AbstractDaemon erben und Implementierungen für die doWork-Methode bereitstellen:

type ConcreteDaemonA struct {
    *AbstractDaemon
    foo int
}

func (a *ConcreteDaemonA) doWork() {
    a.foo++
    fmt.Println("A: ", a.foo)
}

type ConcreteDaemonB struct {
    *AbstractDaemon
    bar int
}

func (b *ConcreteDaemonB) doWork() {
    b.bar--
    fmt.Println("B: ", b.bar)
}

Verwendung

Wir können diesen Beton verwenden Typen, um Instanzen zu erstellen und ihre Methoden aufzurufen:

var dA Daemon = newConcreteDaemonA()
var dB Daemon = newConcreteDaemonB()

dA.start(1 * time.Second)
dB.start(5 * time.Second)

time.Sleep(100 * time.Second)

Dieser Ansatz bietet einen Mechanismus zum Implementieren abstrakter Klassen in Go, der Standardmethodenimplementierungen und Mehrfachvererbung durch Einbettung ermöglicht.

Das obige ist der detaillierte Inhalt vonWie können abstrakte Klassen in Go implementiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn