2014-06-15 11 views
9

Ich bin neu in Go und ich frage mich, wie ich eine Struktur ähnlich abstrakten Klassen & Methoden in Java implementieren kann. In Java würde ich Folgendes tun:Äquivalenz von abstrakten Klassen/Methoden (Java) in Google Go

abstract class A{ 

static method1(){ 
    ... 
    method2(); 
    ... 
} 

abstract method2(); 

} 

class B extends A{ 

method2(){ 
    ... 
} 

} 

class C extends A{ 

method2(){ 
    ... 
} 

} 

Ich weiß über Schnittstellen und Strukturen. Ich könnte eine Schnittstelle und dann eine Struktur erstellen, um Methode1 zu implementieren. Aber was ist mit Methode2? Ich weiß, dass ich eine Schnittstelle in eine andere und auch eine Struktur als ein Feld einer anderen Struktur einbetten kann. Aber ich sehe keine Möglichkeit, meine Struktur mit diesen Methoden zu implementieren.

Die einzige Lösung, die ich sehe, ist Methode 1 sowohl in Klasse B als auch in Klasse C zu implementieren. Gibt es keinen anderen Weg?

Hinweis: natürlich ist es in meinem Fall nicht nur eine Methode. Außerdem habe ich eine Hierarchie abstrakter Klassen und möchte eigentlich nicht alles in die 'Unterklassen' verschieben.

Die Beispiele, die ich im Internet gefunden habe, sind meistens mit nur einer Methode pro Schnittstelle. Es wäre toll, wenn einer von euch mir hier einen Hinweis geben könnte! Vielen Dank.

Antwort

6

Da Go nicht static Methoden im OOP Sinn hat, sieht man oft diese Art von Methoden als Paket-Level-Funktionen umgesetzt:

package mypackage 

func() Method1() { ... } // Below I will call it Function instead 
Solche

Funktionen Paketebene würde dann als Argument eine Schnittstelle nehmen. Der Code würde in diesem Fall in etwa so aussehen:

package main 

import "fmt" 

type Methoder interface { 
    Method() 
} 

func Function(m Methoder) { 
    m.Method() 
} 

type StructB struct{} 

func (s *StructB) Method() { fmt.Println("StructB") } 

type StructC struct{} // You can do some "inheritance" by embedding a base struct 

func (s *StructC) Method() { fmt.Println("StructC") } 

func main() {  
    b := &StructB{} 
    Function(b)  
} 

Ausgang:

StructB 
+0

Wie diese Antwort, und möchte hinzufügen, dass, wenn Sie Struktur-Schnittstelle, wie eine abstrakte Klasse benötigen würden, als Sie das gleiche Prinzip wie @ANisus geschrieben verwenden können, aber Getter-Methoden hinzufügen. So können Sie Strukturparameter wie '' 'Model.getName''' aufrufen, wobei' '' Model''' genau die Struktur enthält, die eine von Ihnen erstellte Schnittstelle auflöst. – Altenrion

9

Sie können Composite-Schnittstellen, zum Beispiel aus dem io Paket:

http://golang.org/src/pkg/io/io.go?s=2987:3047#L57

type Reader interface { 
    Read(p []byte) (n int, err error) 
} 
type Writer interface { 
    Write(p []byte) (n int, err error) 
} 

type ReadWriter interface { 
    Reader 
    Writer 
} 

Als Randbemerkung, versuchen Sie nicht, Java-Code unter Verwendung von unterwegs zu implementieren, versuchen Sie die Go Way lernen .

+0

Danke. Lass mich sehen, ob ich dich richtig verstehe. Sie meinen, ich sollte eine Schnittstelle für Methode1, eine Schnittstelle für Methode2 und eine zusammengesetzte Schnittstelle erstellen. Aber wo stelle ich meine Implementierung für Methode1, die Methode2 verwendet (vielleicht habe ich dies nicht klar genug angegeben)? Ich hätte auf diese Weise immer noch doppelten Code, richtig? – User42

+0

Ich bin nicht sicher, ob ich Sie verstehe, aber wenn 1 struct mehrere Schnittstellen erfüllen kann, oder Sie können Funktionen definieren, die Dinge auf 'interfaceA',' interfaceB' tun und Ihre Strukturen an sie übergeben, anstatt den Code auf der Struktur selbst zu implementieren . – OneOfOne

0

Das Beispiel Sie fragen würde in Java nicht kompiliert werden, wenn Sie aus method1 Schlüsselwort static entfernen, so dass die korrekte abstrakte Klasse in Java möchte so.

public abstract class A { 
    void method1(){ 
    method2();} 
    abstract void method2(); 
} 

Äquivalent zu schaffen, in go-lang würden Sie eine Schnittstelle auf folgende Weise verwenden müssen: Go Playground

package main 

import (
    "fmt" 
) 

type AI interface { 
    //define all methods that you want to override 
    method2() 
} 

type A struct {//this type is an abstract of AI type since it does not implement method2 
    AI 
} 

func (a * A) method1() { 
    a.method2() 
} 

type B struct {//inherit all from A 
    *A 
} 
func (b *B) method2() { 
    fmt.Print("Hello from B method1\n") 
} 

func NewB() *B{ 
    b := &B{} 
    a := &A{b} 
    b.A = a 
    return b 
} 

type C struct {//inherit all from A 
    *A 
} 

func (c *C) method2() { 
    fmt.Print("Hello from C method1\n") 
} 

func NewC() *C{ 
    c := &C{} 
    a := &A{c} 
    c.A = a 
    return c  
} 

func main() { 

    b := NewB() 
    b.method1() 

    c:= NewC() 
    c.method1() 
} 

Da dies immer noch nicht einfach sein kann, wie Java-abstrakte Klassen übersetzen/Arbeitsgeräte/Multi-Vererbung zu go-lang hier ist die Post mit umfassenden Details. Abstract Class in golang