2016-05-13 2 views
1

Ich habe dieseGo: Wie kann ich definieren eine eine Funktion für ähnliche Strukturen

type File struct{} 

type FileRead struct { 
    File 
} 
type FileWrite struct { 
    File 
} 
type CppRead struct { 
    FileRead 
} 
type CppWrite struct { 
    FileWrite 
} 

func (f *File) Open(name string, mod string) { 
    fmt.Println("open", name, mod) 
} 
func (f *FileRead) Open(name string) { f.File.Open(name, "read") } 
func (f *FileWrite) Open(name string) { f.File.Open(name, "write") } 
func (f *CppRead) Open(name string) { f.FileRead.Open(name + ".cpp") } 
func (f *CppWrite) Open(name string) { f.FileWrite.Open(name + ".cpp") } 

func main(){ 
    cpp := &CppWrite{} 
    cpp.Open("main") 
} 

Ich mag es nicht, weil es zwei Funktionen, die das gleiche tun:

func (f *CppRead) Open(name string) 
func (f *CppWrite) Open(name string) 

I können sie als

umschreiben
func (f *CppRead) CppOpen(name string) { f.Open(name + ".cpp") } 
func (f *CppWrite)CppOpen(name string) { f.Open(name + ".cpp") } 

so werden sie mehr ähnlich, aber es gibt noch zwei

Ich weiß, dass ich eine Schnittstelle

type FileRWOpener interface { 
    Open(string) 
} 
func CppOpen(file FileRWOpener, name string) { 
    file.Open(name + ".cpp") 
} 
func main() { 
    cpp := &CppWrite{} 
    CppOpen(cpp, "main") 
} 

Aber ich will es als

cpp.Open("name") // not CppOpen(cpp, "main") 
+0

Es sei denn, Sie sehen einen großen Vorteil davon, dass die Funktion die Dateierweiterung hinzufügt, Sie können '(f * CppRead) Open' und' (f * CppWrite) Open' loswerden und einfach 'CppOpen (cpp," main. cpp ")' – Michael

+0

Es ist nur ein minimales Beispiel, in einem echten Programm macht es mehr nützliche Arbeit. – pioh

Antwort

2

Go nicht reines Objekt Vererbung verwenden kann, ich glaube, Sie nur die gemeinsame Business-Logik setzen können in einer privaten Paketfunktion und rufen Sie die Funktion in den beiden Implementierungen der Methode Open auf.

func changeFileName(name string) { return name + ".cpp" } 
func (f *CppRead) Open(name string) { f.FileRead.Open(changeFileName(name)) } 
func (f *CppWrite) Open(name string) { f.FileWrite.Open((changeFileName(name))) } 

Dies ist ein sehr einfaches Beispiel, die Geschäftslogik könnte komplexer sein.

Verwandte Themen