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
Barbara Streisandoriginal
2024-11-30 02:21:09397parcourir

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()
}

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!

Déclaration:
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