Maison > développement back-end > Golang > Comment implémenter correctement les méthodes d'interface cachée dans Go ?

Comment implémenter correctement les méthodes d'interface cachée dans Go ?

Barbara Streisand
Libérer: 2024-11-30 02:21:09
original
396 Les gens l'ont consulté

How to Properly Implement Hidden Interface Methods in Go?

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()
}
Copier après la connexion

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
Copier après la connexion

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
}
Copier après la connexion

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{})
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal