Questo è il mio primo post qui. Voglio fare quanto segue con l'aiuto di incorporare in GO ,
- estendi
html.Tokenizer
con nuovi metodi di mio - pur essendo ancora in grado di accedere a tutti i metodi esistenti
html.Tokenizer
in il tempo medio - definisce una funzione
WalkBody()
(o un metodo di interfaccia, se possibile) - 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?