Ich habe Probleme, die "Go-way" zu finden, um eine Code-Duplizierung zu lösen. Hier ist das Problem. Beachten Sie Folgendes:Reduzierung der Code-Duplizierung in Golang
type (
WithKey interface {
key() string
}
SharedFunctionality interface {
WithKey
MethodA() string
MethodB() string
// ... etc ...
}
FirstType struct { ... }
SecondType struct { ... }
// ... etc ...
)
func (ft *FirstType) key() string { ... }
func (st *SecondType) key() string { ... }
Nun werden die Methoden in SharedFunctionality
sie hängen nur von den Ergebnissen der key()
Methode. Ich konnte sie wie das Gerät folgende:
func runMethodA(k WithKey) string {
key := k.key()
// do something and return a string
}
func runMethodB(k WithKey) string {
key := k.key()
// do something else and return a string
}
func (ft *FirstType) MethodA() string { return runMethodA(ft) }
func (ft *FirstType) MethodB() string { return runMethodB(ft) }
func (st *SecondType) MethodA() string { return runMethodA(st) }
func (st *SecondType) MethodB() string { return runMethodB(st) }
Was ich über diesen Ansatz nicht mag, ist, dass, wie ich mehr Typen hinzufügen (ThirdType, FourthType, usw.) oder, wie ich mehr Methoden zu SharedFunctionality hinzufügen, ich habe Tonnen hinzufügen von Boilerplate-Code ... speziell für M-Methoden in SharedFunctionality und N-Typen würde ich M * N-Einzeiler wie die 4 oben buchstabieren müssen.
Was würde ich Liebe zu tun ist, so etwas wie:
func (k WithKey) MethodA() string {
key := k.key()
// do something
}
Mit anderen Worten: Ich würde gerne eine Methode einer Schnittstelle zu definieren. Bedeutung: Alle Objekte, die "WithKey" implementieren, erhalten automatisch MethodA() string
, MethodB() string
usw., daher würden sie automatisch die SharedFunctionality
Schnittstelle implementieren. So etwas wie Standardmethoden in Java-Schnittstellen.
Aber ich weiß, es ist unmöglich, eine Methode in einer Schnittstelle zu definieren ...
Was ist der Go-Weg, um dieses Problem zu lösen?
Ich habe einen Ansatz gesehen, wo ich eine Struktur mit einem anonymen Feld des Interface-Typ schaffen würde, und dann werden die Methoden dort implementieren:
type SharedFuncStruct struct {
WithKey
}
func (sfs *SharedFuncStruct) MethodA() string {
key := sfs.key()
// whatever
}
// same for MethodB()
Dann, es zu benutzen, ich möchte etwas tun:
first := ... getFirstTypeValue()
sfs := &SharedFuncStruct{first}
sfs.MethodA() // etc
Das sieht so aus, als könnte es funktionieren, aber es fühlt sich immer noch nach zu viel Vorabcode an.
Andere Alternativen?
Sie haben Ihre Optionen ziemlich genau beschrieben. Und siehe dave Antwort unten. Und denken Sie darüber nach: Was würde passieren, wenn ein konkreter Typ neben 'key()' bereits eine Methode 'MethodA()' hätte? Mindestens _embedding_ macht es unzweideutig, was 'MethodA()' bedeuten würde (in der _ "flachsten Tiefe" _). – icza
Ihre Frage ist im Wesentlichen "wie mache ich Implementierungsvererbung und virtuelle Methoden in go", aber ich denke, Sie haben vielleicht ein xy-Problem. http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem. Wenn Sie einen kleinen Kontext von dem beschreiben, was Sie tun, gibt es wahrscheinlich eine Lösung, die nicht im objektorientierten Java-Design-Design verwurzelt ist, das besser in die Zukunft passt. –