2016-08-23 7 views
-2

두 가지 질문 또는 하나의 질문이 맞는지 잘 모르겠습니다 만, 두 부분으로 나에게 하나의 질문 인 것처럼 보입니다 - 어떻게 인터페이스를 사용해야합니까?인터페이스에 따라 달라지는 golang 인터페이스

인터페이스의 메소드는 전역 적으로 범위가 지정됩니다. 인터페이스 A와 인터페이스 B가 모두 동일한 메소드 Foo를 구현하지만 다른 인수 또는 반환 유형을 구현하는 경우 두 가지 모두를 구현할 수 없습니다. 동일한 유형에서 동일한 시간. 예를 들어, 한 인터페이스에서 GetBytes() 메서드는 반환 형식 [] 바이트 및 다른 ([] 바이트, 오류) 있습니다이 문제를 어떻게 극복해야합니까?

내가 가지고있는 또 다른 문제는 같은 인터페이스에 정의 된 인터페이스 B를 반환하는 인터페이스 A 인터페이스를 정의하려고 할 때입니다. 이제 B를 구현하는 구조체를 반환하면 A를 구현하는 객체를 만들고 싶습니다.이 메서드가 A에서 메서드를 구현하고 B에 대한 종속성을 만들도록 추론 할 정도로 똑똑하지 않습니다. 이것은 완전히 처음부터 인터페이스가 작동하는 방식의 포인트. 이 문제를 어떻게 피할 수 있습니까? 다음 구조체에 대한

type B interface { 
    Bar() 
} 

type A interface { 
    Foo() B 
} 

:

type b_impl struct{} 

func (b b_impl) Bar() {} 

type a_impl struct{} 

func (a a_impl) Foo() b_impl {} 

이와 인터페이스 A를 만족하지 않는 foo는 방법은 내가 필요 내가 가지고있는 경우, 예를 들어

, 확인하십시오 :

func (a a_impl) Foo() B {} 

이는 B가 선언 된 패키지에 종속됩니다.

+0

"이 문제를 어떻게 극복해야합니까?" Go는 메소드 오버로딩을 지원하지 않기 때문에 당신은 할 수 없습니다. https://golang.org/doc/faq#overloading을 참조하십시오. 나는 두 번째 질문에 대해 충분히 이해하지 못한다. 어쩌면 코드 예제를 제공하는 것이 도움이 될 것입니다. – smarx

+0

감사합니다. @smarx - 두 번째 부분에 대한 자세한 내용과 함께 질문을 편집했습니다. – gsf

+0

두 번째 문제에 관해 할 수있는 일이 없다고 생각합니다. – smarx

답변

2

첫 번째 질문 : 다른 작업을 수행하려면 다른 함수 이름을 만들어야합니다. strconv 패키지의 표준 라이브러리를 살펴보면서 상황을 해결하는 방법을 살펴 보자. https://golang.org/pkg/strconv/#pkg-index

거기에 추가 기능의 다른 선언을 살펴 보자. 모든 종류의 기능이 있습니다.

그래서 당신이 FooInt의 연료 소모량이 인터페이스는 또한 FooInter ...

두번째 질문해야한다 예상되는 경우 : 작은 예를 들어. io.Writer 인터페이스를 사용하려면 전체 io 패키지를 가져올 필요가 없습니다. Writer 선언을 자신의 패키지에 복사하는 것이 좋습니다. 이 작업을 올바르게 수행하면 모든 io.Writer 구현이 자동으로 사용자 고유의 Writer 인터페이스를 구현합니다.

이의이 인터페이스 a.A와 b.B.와 패키지 A와 B가 있다고 가정 해 봅시다 :

아마 다른 의견을 읽고 나면 당신은 다른 상황이 이 상황이있는 경우 :

type A interface{ 
    Foo() b.B 
} 

는 당신이 a.A에 대한 구현을 작성해야합니다, 당신은 패키지 B를 가져와야합니다. 하지만 바이너리는 커지지 않습니다. 왜냐하면 b에 의존하는 패키지 a를 항상 가져와야하기 때문입니다.

+0

아니, 이론적으로 전혀. 이것들은 제가 실제로 가지고있는 두 가지 이슈입니다. 나는 변화를 "필요하다"는 것은 좋은 제안이지만, 나는 내가 의존하는 모든 것의 소유자가 아니기 때문에 "나는"그것을 바꿀 수 없다. 두 번째 질문에서 io.Writer 예제는 내 경우와 아무런 관련이 없습니다. io.Writer처럼 여러 인터페이스가 필요합니다. 나는 의존성이 암시 적으로 얻어진 표준 라이브러리를 작성하지 않기 때문에이 문제는 매우 현실적이다. – gsf

+0

그 소리가 약간 힘들다면 죄송합니다. 이것은 의도가 아니어야합니다, 영어는 제 1 언어가 아닙니다. 그러나 기존 코드가 있으면 기존 구조와 구현해야 할 부분에 대해 조금 더 알게됩니다. 그리고 당신의 문제는 io.Writer가 아니라는 것을 알고 있습니다. 모든 추가 의견을 읽은 후에 귀하의 문제를 이해합니다. 외부 패키지 a가 외부 인터페이스 b.B를 사용하는 경우이를 해결하고 패키지 b를 가져 오는 다른 방법은 없습니다. – apxp

+0

몇 가지 인터페이스가 포함 된 프로토콜을 가지고 있습니다. A는 B. 둘 다 동일한 패키지에 속합니다. 그 때문에이 패키지에 직접 의존하지 않고 이러한 인터페이스를 구현하는 것은 불가능합니다. 이것이 없으면 가능할 것입니다. 그것이 문제입니다. – gsf

관련 문제