Estensione di un tipo esistente in Vai

1

Questo è il mio primo post qui. Voglio fare quanto segue con l'aiuto di incorporare in GO ,

  1. estendi html.Tokenizer con nuovi metodi di mio
  2. pur essendo ancora in grado di accedere a tutti i metodi esistenti html.Tokenizer in il tempo medio
  3. definisce una funzione WalkBody() (o un metodo di interfaccia, se possibile)
  4. in cui viene utilizzato un metodo di interfaccia di VisitToken() , che sarà si comportano in modo diverso per tipi diversi

Dopo una discussione estesa in [go-nuts] mlist, ho modificato il codice di esempio di link a link secondo tutti i suggerimenti lì.

Tuttavia, tutti i suggerimenti fino ad ora si sono limitati a un focus, ma non tutti e quattro insieme. Ad esempio, i primi due obiettivi possono essere raggiunti con "type MyTokenizer struct", ma non appena lo cambio al tipo di interfaccia per fungere da base per i due diversi tipi estesi (per l'obiettivo # 3 e 4), obiettivo n. 2 pause. I.e,

funziona,

type MyTokenizer struct {
    *html.Tokenizer
}

func NewMyTokenizer(i io.Reader) *MyTokenizer {
 z := html.NewTokenizer(i)
 return &MyTokenizer{z}
}

Non appena ho provato il seguente suggerimento, tutto ha cominciato a rompersi.

type TokenVisitor interface {
    VisitToken()
}

func WalkBody(of TokenVisitor) {
    // here you call of.VisitToken()
}

type MyTokenizer1 struct {
    *html.Tokenizer
}

func (the MyTokenizer1) VisitToken() {

}

type MyTokenizer2 struct {
    *html.Tokenizer
}

func (the MyTokenizer2) VisitToken() {

}

Mi sembra che debba essere fatto un compromesso, qual è il minimo compromesso da fare?

Il vero scopo per me di porre questa domanda è che ho un sistematico che pensa in OO come risolvere questo tipo di ereditarietà. migliorare il problema, e c'è una implementazione pratica in atto per me, le funzioni virtuali. Ma quando si tratta di Go, ho ancora bisogno di aiuto su come pensare e come fare.

Chiunque può aiutare per favore? C'è un modo sistematico per affrontare situazioni come questa?

    
posta xpt 03.01.2018 - 16:25
fonte

1 risposta

0

Mi spiace,

Matt ha dato una risposta stamattina, @
link

Ma pensavo che all'inizio non avrebbe funzionato, ora dopo averlo riflettuto e finito, finalmente lo faccio funzionare.

Quindi risponde alla domanda, anche se si sente come il codice degli spaghetti, lo farò  segna ancora come risposta, per ora.

Se qualcuno vuole fare il chip, sarò lieto di accettare la tua risposta.

    
risposta data 04.01.2018 - 02:30
fonte

Leggi altre domande sui tag