Implémentation d'interfaces avec des méthodes non exportées dans Go
Considérez une situation dans laquelle vous souhaitez définir une interface pour l'accès au système comptable tout en masquant des détails spécifiques d'implémentation . Vous avez l'intention de rendre les méthodes d'interface non exportées et de fournir des fonctions exportées dans le package de base qui appellent la même fonction à partir d'un adaptateur local. Cependant, le compilateur génère une erreur en raison de l'implémentation non exportée de la méthode.
Est-il possible d'implémenter une interface avec des méthodes non exportées dans un package différent ?
Réponse :
Une solution potentielle consiste à utiliser des champs de structure anonymes :
type Adapter struct { accounting.IAdapter }
Cependant, il est Il est essentiel de noter que cette approche ne permet pas de fournir votre propre implémentation des méthodes non exportées. En d'autres termes, vous ne pouvez pas remplacer l'implémentation de IAdapter.getInvoice() dans Adapter.
Approche alternative :
Si la dissimulation du système de comptabilité.Le type d'adaptateur des autres packages est souhaité, rendez le type non exporté et créez une fonction pour enregistrer l'adaptateur avec le package de comptabilité :
package accounting type IAdapter interface { GetInvoice() error } --- package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) } --- package main func main() { accountingsystem.SetupAdapter() }
Cette approche résout le problème en encapsulant le type d'adaptateur non exporté dans le package de comptabilité, limitant ainsi son accessibilité à d'autres packages.
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!