2015-04-29 3 views
0

У меня есть интерфейс:Правильный способ вызвать перегруженный метод встроенного типа в Go

package pkg 
type BaseInterface interface { 
    func Nifty() bool 
    func Other1() 
    func Other2() 
    ... 
    func Other34123() 
} 

и структуру, которая реализует его:

package pkg 
type Impl struct {} 
func (Impl) Nifty() bool { ... } 

Затем идет вдоль другой-структуру, которая хочет, чтобы встраивать первый и сделать это самостоятельно Острота():

package myOtherPackage 
import "pkg" 
type ImplToo struct { 
    *pkg.Impl 
} 
func (it ImplToo) Nifty() bool { ... something else ... } 

Это вроде как класса inheretance с методом переопределения в объектный LA nguage. Я хочу знать, как сделать эквивалент implToo.super(). Nifty(), то есть из реализации ImplToo Nifty(), вызывается реализация pkg.Impl Nifty().

Какое правильное преобразование используется на it, чтобы я мог это сделать? Все, что я пытаюсь выходы либо неограниченную рекурсию на Nifty ImplToo (в), или какая-то ошибка компилятора, такие как:

invalid type assertion: (&it).(BaseInterface) (non-interface type *it on left)

... или много вариаций на это.

+1

Вы пробовали 'it.Impl. Острота() '? – icza

+0

я сделал. Проблема в том, что мой фактический «Impl» действительно назван как-то вроде «name.withADot», поэтому синтаксический анализ сообщает мне эквивалент '(тип ImplToo не имеет имени поля или метода). Казалось, это заставило меня подумать« ОК, , но он. (name.withADot) .Nifty анализируется как преобразование интерфейса и возвращается к ошибке «non-interface type on left». – BadZen

+1

Не понимаю. Идентификатор не может содержать символ точки. Отправьте свой код. – icza

ответ

1

Вы ищете;

type ImplToo struct { 
    pkg.Impl 
} 

func (it ImplToo) Nifty() bool { return it.Impl.Nifty() } 

Ваше использование указателей несовместимо, что, вероятно, является (не положительным) частью вашей проблемы. Если вы хотите, чтобы встроенный тип указывал указатель, сделайте так, чтобы ваши методы получали тип указателя, чтобы избежать этой проблемы.

Если вы хотите явно использовать метод во встроенном типе, вы ссылаетесь на него, используя тип, в котором вы обычно должны иметь имя свойства.

+0

Пожалуйста, обратите внимание на мое редактирование с префиксом пакета выше. Ваш ImplToo не является допустимым объявлением структуры, потому что Impl не определен. Это pkg.Impl в локальном пакете.Если это pkg.Impl, я получаю '(тип ImplToo не имеет поля или имени метода pkg)' – BadZen

+1

@BadZen ok, я обратился к вашей проблеме с пакетом. Это не влияет на тело Nifty, только декларация stucts. – evanmcdonnal

+0

Создание нового типа, не имеющего встраивания, не помогает - есть функции с ресивером типа, которые/не перегружены/таким образом, и я хочу иметь возможность вызывать их из одного и того же выражения. Вы в основном говорите: «Не используйте вложения, сочиняйте все». Это здорово, пока мне не нужно передать мой тип в уже существующую функцию, которая ожидает BaseInterface. Также рассмотрите необходимость вызова myImpl.In.A.Really.Long.Chain.Of.Subclasses() .... – BadZen

1

Что сказал @evanmcdonnal. Ваш Nifty должен либо взять указатель, либо нет. Если вы вставляете указатель в pkg.Impl, то ваша функция Nifty должна принимать указатель на структуру. Если ваша функция Nifty не принимает указатель, тогда ваш внедренный тип не должен быть указателем.

Вот встроенный указатель, который работает.

·> кошка main.go

package main 

import (
    "cs/pkg" 
    "fmt" 
) 

type ImplToo struct { 
    *pkg.Impl 
} 

func (it *ImplToo) Nifty() bool { 
    fmt.Printf("Impl.Nifty() is %t\n", it.Impl.Nifty()) 
    return false 
} 

func main() { 
    i := new(ImplToo) 
    fmt.Println(i.Nifty()) 
} 

·> кошка CS/упак/test.go

package pkg 

type BaseInterface interface { 
    Nifty() bool 
} 

type Impl struct{} 

func (i *Impl) Nifty() bool { 
    return true 
} 

Выход:

Impl.Nifty() is true 
false 
+0

Он работает нормально сейчас с указателем во встраивании, а не в приемник, я думаю. Означает ли это, что есть дополнительная копия интерфейса приема? Он не компилируется, когда оба являются указателями: 'ImplToo не реализует pkg.BaseInterface (метод Nifty имеет приемник указателей)' – BadZen

 Смежные вопросы

  • Нет связанных вопросов^_^