Maison  >  Article  >  développement back-end  >  Interface d'instanciation

Interface d'instanciation

WBOY
WBOYavant
2024-02-08 21:08:41359parcourir

Interface dinstanciation

L'éditeur PHP Youzi est là pour vous présenter ce qu'est une interface d'instanciation. En programmation orientée objet, une interface est une convention qui définit les méthodes qu'une classe doit implémenter. L'instanciation d'une interface fait référence à la création d'un objet d'une classe pour implémenter les méthodes définies dans l'interface. En instanciant l'interface, nous pouvons profiter de la fonctionnalité polymorphe afin que différentes classes puissent implémenter la même interface et réécrire les méthodes correspondantes en fonction de la situation réelle. L'utilisation d'interfaces d'instanciation peut rendre notre code plus flexible et extensible, et améliorer la réutilisabilité et la maintenabilité du code. Examinons de plus près l'utilisation et les précautions de l'interface instanciée.

Contenu des questions


Je suis nouveau. Une chose que je ne comprends pas, c'est pourquoi j'obtiens une erreur de compilation lorsque je souhaite instancier l'interface individuellement, mais pas lorsque j'utilise la forme tableau de l'interface.

type Flag interface {
  fmt.Stringer
}

func TestCheckRequiredFlag(t *testing.T) {
    testdata := []struct {
        st []Flag
    }{
        {
            st: []Flag{//allowed
                &StringFlag{Name: ""},
            },
        },
    }

    st := struct {
        st Flag
    }{
        st: Flag{// is not allowed
            &StringFlag{Name: ""},
        },
    }
}

Ce littéral composé alloue une nouvelle instance de structure avec la valeur donnée.


Solution de contournement


accolades {} 用于切片、结构、数组和映射的文字值。它们不用于接口值。如果您想要接口类型的文字值,则必须使用 () syntaxe, qui appelle "conversion de type".

Par exemple :

x := myinterface(&mystruct{})

x 的类型为 myinterface.

Pour corriger votre code :

    st := struct {
        st flag
    }{
        st: flag(
            &stringflag{name: ""},
        ),
    }

Vous pouvez également supprimer complètement la conversion de type, car go permet l'affectation directe aux valeurs d'interface et la conversion est implicite. Plus précisément, la règle Assignability dit (éditée pour plus de clarté) :

Si t est un type d'interface et que x implémente t, alors une valeur x de type v est attribuable à une variable de type t.

Donc, ce code fonctionnera aussi :

    st := struct {
        st Flag
    }{
        st: &StringFlag{Name: ""},
    }

Notez que dans les littéraux composés tels que les tranches, les structures et les cartes, les valeurs données sont traitées attribuées à leurs index, champs ou clés respectifs comme s'il s'agissait de variables, donc les règles d'assignation s'appliquent.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer