高浪包接口

我对golang有点陌生,我有一个关于包和接口的问题。如果我有packue1,它需要使用一个接口的实现,将来可以与其他实现交换,这可能吗?


一些伪代码


包实现包含接口的当前实现


type TestI interface {

   M1()

}

package implementation


type Impl struct {}


funct (i *Impl) M1 ( ... do something )


package package1


import TestI somehow and call M1 method but with flexibility to swap it with other implementation of this interface in future?

包包1应该在不知道的情况下使用实现(就像c#或java中的DI一样,包应该只知道接口,而不知道实现)TestI接口应该在哪里定义?抱歉,如果这有点令人困惑,只是想让我的头脑绕过它。


这在 c 中是等效的#


ITest {

  SetClass(Class1 cl);

}


// package1

class Class1 {

  private ITest test {get; set;}


  public void SomeMethod() {

// i want to somehow set this in other package

    test.SetClass(this);

  }

}


// package2

class Test implements ITest {

 private Class1 cl;


SetClass(Class1 c) {

 this.c1 = c;

}


}


有只小跳蛙
浏览 101回答 1
1回答

SMILET

除非您正在编写接口优先的应用程序,否则通常最好在不声明任何接口的情况下编写具体实现。然后,该包的用户可以声明必要的接口。例如:type Implementation struct {   ...}func (i Implementation) FuncA() {...}func (i Implementation) FuncB() {...}如果需要实现的某个类型,则可以声明:FuncAtype IntfA interface {   FuncA()}具有该方法的任何类型都实现 ,并且符合该说明,因此您可以将 的实例传递给需要 的函数。FuncAIntfAImplementationImplementationIntfA同样,如果您需要一个同时包含 和 的接口,则可以声明:FuncAFuncBtype IntfAB interface {   FuncA()   FuncB()}并实现 .ImplementationIntfAB因此,理想情况下,您将在使用它的位置声明所需的接口,并且具有一组匹配方法的任何类型都可用于该接口的实现。如果您基于现有接口编写,则可以将该接口放在与实现不同的包中,或者可以将接口和实现保留在同一包中,以对您的用例更有意义为准。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go