Implémentation d'interfaces avec des méthodes cachées
Lors du développement d'un système comptable, il peut être souhaitable de masquer les implémentations spécifiques d'une interface du programme principal pour garantir qu’un seul système comptable est actif. Pour y parvenir, on peut envisager de rendre les méthodes d'interface non exportées et de créer des fonctions exportées qui appellent une fonction à partir d'un adaptateur local.
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() }
Cependant, cette approche rencontre une erreur de compilation car le compilateur ne peut pas accéder au getInvoice non exporté. méthode du package du système de comptabilité.
cannot use adapter (type accountingsystem.Adapter) as type accounting.IAdapter in argument to accounting.SetAdapter: accountingsystem.Adapter does not implement accounting.IAdapter (missing accounting.getInvoice method) have accountingsystem.getInvoice() error want accounting.getInvoice() error
Champ de structure anonyme Approche
Une solution possible consiste à utiliser des champs de structure anonymes. Bien que cela permette à l'accountingsystem.Adapter de satisfaire l'interface comptable.IAdapter, cela empêche l'utilisateur de fournir sa propre implémentation de la méthode non exportée.
type Adapter struct { accounting.IAdapter }
Approche alternative
Une approche plus idiomatique consiste à créer un type d'adaptateur non exporté et à fournir une fonction pour enregistrer l'adaptateur auprès de la comptabilité. package.
package accounting type IAdapter interface { GetInvoice() error } package accountingsystem type adapter struct {} func (a adapter) GetInvoice() error {return nil} func SetupAdapter() { accounting.SetAdapter(adapter{}) }
En utilisant cette approche, le type comptabilitésystem.adapter est masqué du programme principal et le système comptable peut être initialisé en appelant la fonction SetupAdapter.
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!