Implémentation d'interfaces avec des méthodes non exportées dans les packages
Dans Go, l'implémentation d'une interface nécessite généralement de définir des méthodes exportées qui correspondent à la signature de l'interface. Cependant, il existe des scénarios dans lesquels le maintien de l'accessibilité de l'implémentation n'est pas souhaitable. Cet article explore la faisabilité d'implémenter des interfaces avec des méthodes non exportées dans des packages séparés.
Considérez l'extrait de code suivant, où l'implémentation du système comptable (accountingsystem) est cachée dans un type non exporté :
package accounting import "errors" type IAdapter interface { getInvoice() error } var adapter IAdapter func SetAdapter(a IAdapter) { adapter = a } func GetInvoice() error { if (adapter == nil) { return errors.New("No adapter set!") } return adapter.getInvoice() } package accountingsystem type Adapter struct {} func (a Adapter) getInvoice() error {return nil}
Malheureusement, cette approche génère une erreur de compilation, car la méthode getInvoice() non exportée du package du système de comptabilité n'est pas visible par la comptabilité. package.
Approches alternatives
Champs de structure anonymes :
Une solution consiste à implémenter l'interface à l'aide d'un champ de structure anonyme dans le package de l’interface. Cela permet de satisfaire l'interface sans exposer l'implémentation :
package accounting type IAdapter interface { GetInvoice() error } type Adapter struct { IAdapter } func (*Adapter) GetInvoice() error { // Custom implementation }
Fonction de configuration :
Vous pouvez également créer une fonction distincte pour configurer l'adaptateur en vous inscrivant le type non exporté comme adaptateur :
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 vous permet de garder le type de l'adaptateur privé tout en déléguant le processus d'enregistrement à une autre fonction.
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!