2014-06-15 9 views
9

Sono un nuovo arrivato e mi chiedo come sia possibile implementare una struttura simile ai metodi astratti delle classi & in Java. In Java, farei quanto segue:Equivalenza di classi/metodi astratti (Java) in Google Go

abstract class A{ 

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

abstract method2(); 

} 

class B extends A{ 

method2(){ 
    ... 
} 

} 

class C extends A{ 

method2(){ 
    ... 
} 

} 

Conosco interfacce e strutture. Potrei costruire un'interfaccia e quindi una struttura per implementare method1. Ma per quanto riguarda method2? So che posso incorporare un'interfaccia in un'altra e anche una struttura come un campo di un'altra struttura. Ma non vedo un modo per implementare la mia struttura con quei metodi.

L'unica soluzione che vedo è implementare il metodo1 sia in classe B che in classe C. Non c'è un altro modo?

Nota: ovviamente nel mio caso non è solo un metodo. Inoltre ho una gerarchia di classi astratte e non voglio davvero spostare tutto nelle "sottoclassi".

Gli esempi che ho trovato su Internet sono per lo più con un solo metodo per interfaccia. Sarebbe bello se uno di voi ragazzi potesse darmi un suggerimento qui! Grazie.

risposta

6

Dal Go non hai static metodi nel senso OOP, si vedono spesso questi tipi di metodi in corso di attuazione, come le funzioni di livello di pacchetto:

package mypackage 

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

funzioni come livello di pacchetto avrebbe poi prendere un'interfaccia come argomento. Il tuo codice sarebbe in tal caso simile a questa:

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)  
} 

uscita:

StructB 
+0

Come questa risposta, e voglio aggiungere, che se aveste bisogno di avere un'interfaccia di struttura, come una classe astratta, di quanto possiate usare lo stesso principio scritto da @ANisus, ma aggiungete metodi getter. In modo che tu possa chiamare parametri di struttura come '' 'Model.getName''' dove' '' Model''' avrebbe una struttura esatta che risolve alcune interfacce che hai creato. – Altenrion

9

Si possono avere interfacce composite, ad esempio dal pacchetto io:

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 
} 

Come nota a margine, non cercare di implementare il codice Java utilizzando andare, cercare di imparare il Go Way .

+0

Grazie. Fammi vedere se ti capisco correttamente. Vuoi dire che dovrei creare un'interfaccia per method1, un'interfaccia per method2 e un'interfaccia composita. Ma dove metto la mia implementazione per method1 che usa method2 (forse non l'ho detto abbastanza chiaro)? Avrei ancora un codice duplicato in questo modo, giusto? – User42

+0

Non sono molto sicuro di averti capito, ma se 1 struct può soddisfare più interfacce, o puoi definire funzioni che fanno cose su 'interfaceA',' interfaceB' e passa loro le tue strutture invece di implementare il codice sulla struct stessa . – OneOfOne

0

L'esempio si sta chiedendo non sarebbe compilare in Java a meno che non si rimuove parola chiave statica method1, in modo che il corretto classe astratta in Java vorrebbe questo.

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

Per fornire equivalente a go-lang si dovrà utilizzare un'interfaccia nel seguente modo: 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() 
} 

Dal momento che questo ancora può non essere facile come tradurre/implementare java classi astratte/multi-eredità di go-lang qui è il post con dettagli completi. Abstract Class in golang