Heim  >  Artikel  >  Backend-Entwicklung  >  Instanziierungsschnittstelle

Instanziierungsschnittstelle

WBOY
WBOYnach vorne
2024-02-08 21:08:41359Durchsuche

Instanziierungsschnittstelle

Der PHP-Editor Youzi ist hier, um Ihnen vorzustellen, was eine Instanziierungsschnittstelle ist. In der objektorientierten Programmierung ist eine Schnittstelle eine Konvention, die die Methoden definiert, die eine Klasse implementieren soll. Das Instanziieren einer Schnittstelle bezieht sich auf das Erstellen eines Objekts einer Klasse, um die in der Schnittstelle definierten Methoden zu implementieren. Durch die Instanziierung der Schnittstelle können wir die polymorphe Funktion nutzen, sodass verschiedene Klassen dieselbe Schnittstelle implementieren und die entsprechenden Methoden entsprechend der tatsächlichen Situation neu schreiben können. Die Verwendung von Instanziierungsschnittstellen kann unseren Code flexibler und erweiterbarer machen und die Wiederverwendbarkeit und Wartbarkeit des Codes verbessern. Schauen wir uns die Verwendung und Vorsichtsmaßnahmen der instanziierten Schnittstelle genauer an.

Frageninhalt


Ich bin neu dabei. Was ich nicht verstehe, ist, warum ich einen Kompilierungsfehler erhalte, wenn ich die Schnittstelle einzeln instanziieren möchte, aber nicht, wenn ich die Array-Form der Schnittstelle verwende.

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: ""},
        },
    }
}

Dieses zusammengesetzte Literal weist eine neue Strukturinstanz mit dem angegebenen Wert zu.


Problemumgehung


geschweifte Klammern {} 用于切片、结构、数组和映射的文字值。它们不用于接口值。如果您想要接口类型的文字值,则必须使用 () Syntax, die „Typkonvertierung“ aufruft.

Zum Beispiel:

x := myinterface(&mystruct{})

x 的类型为 myinterface.

So korrigieren Sie Ihren Code:

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

Sie können die Typkonvertierung auch vollständig entfernen, da go eine direkte Zuweisung zu Schnittstellenwerten ermöglicht und die Konvertierung implizit erfolgt. Genauer gesagt besagt die Zuweisbarkeitsregel (aus Gründen der Klarheit bearbeitet):

Wenn t ein Schnittstellentyp ist und x t implementiert, dann ist ein Wert x vom Typ v einer Variablen vom Typ t zuweisbar.

Dieser Code funktioniert also auch:

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

Beachten Sie, dass in zusammengesetzten Literalen wie Slices, Strukturen und Karten die angegebenen Werte ihren jeweiligen Indizes, Feldern oder Schlüsseln so

zugewiesen behandelt werden, als wären sie Variablen, sodass Zuweisungsregeln gelten.

Das obige ist der detaillierte Inhalt vonInstanziierungsschnittstelle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen