If the calling function needs more than the interface methods (such as 
access to type-specific struct fields) then an approach is to use an 
interface type switch for per-type 
behavior: https://tour.golang.org/methods/16

Matt

On Tuesday, January 2, 2018 at 1:05:22 PM UTC-6, Tong Sun wrote:
>
> Oh Thanks Matt, when Ian explained to me, I didn't think it'd work, but 
> on seeing your code illustration, I now think it works perfectly for 
> *this* case. 
>
> Just that this function approach will break if there are many base class 
> member fields that need to be accessed, as type methods can access them 
> internally, under the encapsulation. But that's a different story...
>
> Thanks again *everyone*!
>
>
> On Tue, Jan 2, 2018 at 10:26 AM, <matthe...@gmail.com <javascript:>> 
> wrote:
>
>> You want different tokenizer types to be used in the same WalkBody 
>> implementation. Interfaces abstract the implementation from the calling 
>> computation.
>>
>> I think Ian did answer your question.
>>
>> 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() {
>>
>> }
>>
>> // call WalkBody somewhere with either MyTokenizer1 or MyTokenizer2
>>
>> When I wanted to write one list of tests for two different set types I 
>> added set.go and set_test.go here: 
>> https://github.com/pciet/pathsetbenchmark
>>
>> Matt
>>
>> On Tuesday, January 2, 2018 at 8:45:56 AM UTC-6, Tong Sun wrote:
>>>
>>>
>>>
>>> On Mon, Jan 1, 2018 at 9:46 PM, Tong Sun <sunto...@gmail.com> wrote:
>>>
>>>> Hi, 
>>>>
>>>> I think I generally understand how embedding (
>>>> https://golang.org/doc/effective_go.html#embedding) works in GO. 
>>>> However, when it comes to the following problem, I'm at lost again. 
>>>>
>>>> I'm trying to extend the `html.Tokenizer` with new methods of my own:
>>>>
>>>> type MyTokenizer struct {
>>>>  html.Tokenizer
>>>> }
>>>>
>>>>
>>>> func NewMyTokenizer(i io.Reader) *MyTokenizer {
>>>>  z := html.NewTokenizer(i)
>>>>  return *MyTokenizer(z)
>>>>  return &MyTokenizer{z}
>>>> }
>>>>
>>>>
>>>>
>>>> so code like
>>>>
>>>>  z := html.NewTokenizer(body)
>>>> ...
>>>> func parseBody(z *html.Tokenizer) {
>>>>   tt := z.Next()
>>>> ...
>>>>  testt := z.Token()
>>>> ...
>>>>
>>>>
>>>> can become:
>>>>
>>>>  z := NewMyTokenizer(body)
>>>> ...
>>>> func (z *MyTokenizer) parseBody() {
>>>>  tt := z.Next()
>>>> ...
>>>>
>>>>  testt := z.Token()
>>>> ...
>>>>
>>>>
>>>>
>>>>
>>>> However, I'm really struggling to make it work as I was expected. 
>>>>
>>>> Somebody help please, what's the proper way to extend a type with new 
>>>> methods of my own, while still able to access all existing methods? 
>>>>
>>>
>>>
>>> Thanks to Jason Phillips' help, the above part is solved:
>>>
>>> type MyTokenizer struct {
>>>     *html.Tokenizer
>>> }
>>>
>>> func NewMyTokenizer(i io.Reader) *MyTokenizer {
>>>  z := html.NewTokenizer(i)
>>>  return &MyTokenizer{z}
>>> }
>>>
>>>  What's remaining is, 
>>>
>>> Further more, how to extend the above even further? --
>>>>
>>>> - I plan to define an interface with a new method `WalkBody()`, in 
>>>> which a "virtual" method of `VisitToken()` is used. 
>>>> - Then I plan to define two different type of MyTokenizer, with their 
>>>> own `VisitToken()` methods, so the same `WalkBody()` method defined in 
>>>> MyTokenizer will behave differently for those two different types. 
>>>>
>>>> How to architect above in Go? 
>>>>
>>>
>>> I've found this afterward, 
>>>
>>> http://hackthology.com/object-oriented-inheritance-in-go.html
>>>
>>> I'll digest and try it out, and see how that can solve the above 
>>> problem, because it builds bottom up (not mid-way up). 
>>>
>>> Meanwhile, if someone can explain how to think and solve such problem in 
>>> Go, that'd be much appreciated. Only at the architectural level would be 
>>> fine for me, I can try it out myself. The real problem to me is that I have 
>>> a *systematic *thinking in OO how to solve such kind of inherit & 
>>> enhance problem, and there is a *practical *implementation in place for 
>>> me, the virtual functions. But when it comes to Go, I still need help for 
>>> how to *think*, and how to *do*. 
>>>
>>> Thanks!
>>>  
>>>
>>>>
>>>> For your convenience, you can use this as an easy start, when 
>>>> demonstrating your architectural solution.
>>>>
>>>> https://github.com/suntong/lang/blob/master/lang/Go/src/xml/htmlParserTokens.go
>>>>
>>>>
>>>> Thx a lot!
>>>>
>>>>
>>>> -- 
>>>> You received this message because you are subscribed to a topic in the 
>>>> Google Groups "golang-nuts" group.
>>>> To unsubscribe from this topic, visit 
>>>> https://groups.google.com/d/topic/golang-nuts/FRE_A6cNzW8/unsubscribe.
>>>> To unsubscribe from this group and all its topics, send an email to 
>>>> golang-nuts...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>
>>> -- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "golang-nuts" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/golang-nuts/FRE_A6cNzW8/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> golang-nuts...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to