Implémentation de classes abstraites dans Go
Go ne prend pas en charge nativement les classes abstraites en raison de l'accent mis sur la sécurité et la simplicité. Cependant, il existe des solutions de contournement pour simuler un comportement abstrait.
Question originale
La question traite de l'incapacité d'avoir des implémentations par défaut dans les interfaces de Go. Comme les interfaces dans Go ne peuvent pas contenir de champs, il est difficile d'implémenter un objet sans état avec des comportements par défaut.
Solution de contournement à l'aide d'un démon abstrait
La solution fournie utilise un démon abstrait qui sert comme intermédiaire entre l'interface et les implémentations concrètes.
type AbstractDaemon struct { Daemon }
Le démon abstrait reçoit la structure de l'interface via son champ Démon. Cela permet de définir des comportements par défaut dans le démon abstrait.
func (a *AbstractDaemon) start(duration time.Duration) { // Default implementation for start }
Implémentations concrètes
Les implémentations concrètes intègrent le démon abstrait et définissent leurs propres méthodes doWork :
type ConcreteDaemonA struct { *AbstractDaemon foo int } func (a *ConcreteDaemonA) doWork() { // Custom implementation for ConcreteDaemonA }
Instanciation et Utilisation
Les implémentations concrètes peuvent être instanciées et utilisées comme type d'interface :
var dA Daemon = newConcreteDaemonA() dA.start(1 * time.Second)
Évaluation
Cette solution de contournement fournit un moyen pour implémenter des classes abstraites dans Go en découplant les comportements par défaut de l'interface et en les définissant dans une structure abstraite distincte. C'est une approche couramment utilisée dans Go pour obtenir un comportement abstrait malgré les limitations du langage.
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!