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 :
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!