dieser Code Gegeben zu finden ...Schnittstelle Methode kann nicht auf Unterklasse von Superklasse
type BaseItf1 interface {
getName() string
clone() *BaseStruct
}
type BaseStruct struct {
BaseItf1
}
func (bs *BaseStruct) cloneAndGetName() string {
sc := bs.clone()
return sc.getName()
}
type SubClass struct {
BaseStruct
}
func (sc *SubClass) getName() string {
return "A"
}
func (sc *SubClass) clone() *SubClass {
return &SubClass{}
}
func main() {
sc := &SubClass{}
fmt.Printf("-> %s\n", sc.clone().getName())
fmt.Printf("-> %s\n", sc.cloneAndGetName())
}
Ich kann nicht ganz verstehen, warum ich immer diese Fehlermeldung:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x2004a]
Der Anruf zu clone
in main
funktioniert natürlich perfekt.
In cloneAndGetName
kann die Methode clone
jedoch nicht aufgerufen werden. bs
wird in einen Zeiger auf BaseStruct
eingegeben, der die BaseItf
Schnittstelle mit der clone
Methode hat. Es scheint, als ob die konkrete sc
Instanz in main
, die aufgerufen cloneAndGetName
weiß, wie die clone
Methode zu finden.
Was fehlt mir? Gibt es einen besseren Weg? In meinem echten Code benötige ich eine Möglichkeit, eine neue Instanz eines Objekts aus einem gemeinsam genutzten Code zu erstellen.
Der erste Aufruf von 'sc.clone()' gibt den Fehler Sie sehen, und nicht der Anruf in 'cloneAndGetName'. Sie können main mit 'sc: = & SubClass {}; sc.clone() 'zu verifizieren. –
Ich bin mir nicht sicher, Paul. Wenn ich 'fmt.Printf (" ->% s \ n ", sc.clone(). GetName())' kommentiere, wird der Fehler fortgesetzt. – object88
Beide sind fehlerhaft, aber der eine, der zuerst erscheint (der 'sc.clone()' in main), verursacht den Fehler, den Sie sehen. Wenn Sie es auskommentieren, erhalten Sie den gleichen Fehler von dem anderen Befehl. Der Text Ihrer Frage deutet darauf hin, dass Sie der Meinung waren, dass nur der zweite (der Code in "cloneAndGetName") den Fehler verursacht und dass "der Aufruf von' clone' in 'main' natürlich perfekt funktioniert." –