Maison >développement back-end >Golang >Comment les classes abstraites peuvent-elles être implémentées dans Go ?

Comment les classes abstraites peuvent-elles être implémentées dans Go ?

DDD
DDDoriginal
2024-11-29 10:50:11490parcourir

How Can Abstract Classes Be Implemented in Go?

Implémentation de classes abstraites dans Go

Dans Go, les classes abstraites ne sont pas prises en charge nativement. Cependant, il est possible d'émuler le comportement d'une classe abstraite en utilisant une approche qui implique :

  1. Définir une interface avec les méthodes abstraites souhaitées.
  2. Créer un type avec un récepteur intégré qui remplit les interface et fournit des implémentations par défaut pour le méthodes.

Exemple

Considérez le code suivant, qui définit un démon de type abstrait avec les méthodes start et doWork :

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

Pour fournir des implémentations par défaut, nous pouvons créer un type abstrait (par exemple, AbstractDaemon) qui intègre l'interface Daemon et fournit implémentations par défaut pour les méthodes :

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()
        }
    }()
}

Types concrets

Maintenant, nous pouvons créer des types concrets qui héritent du type AbstractDaemon et fournir des implémentations pour la méthode doWork :

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)
}

Utilisation

Nous pouvons utiliser ces types concrets pour créer des instances et appeler leurs méthodes :

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

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

time.Sleep(100 * time.Second)

Cette approche fournit un mécanisme d'implémentation de classes abstraites dans Go, permettant des implémentations de méthodes par défaut et un héritage multiple via l'intégration.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn