当前位置: 首页 > 面试题库 >

类型组成:覆盖接口类型

宇文温文
2023-03-14
问题内容

我想组成另一种类型的类型,但用假冒替换字段之一(这是接口值)。我遇到的问题是正在使用基础字段,因此我似乎无法覆盖该字段。

我在这里演示了这个问题:https :
//play.golang.org/p/lHGnyjzIS-Y

package main

import (
    "fmt"
)

type Printer interface {
    Print()
}

type PrinterService struct {}

func (ps PrinterService) Print() { fmt.Println("PrinterService") }

type Service struct {
    Client PrinterService
}

func (s Service) PrintViaMethod() { s.Client.Print() }

type FakeService struct {
    Service
    Client Printer
}

type SomeOtherService struct {}

func (sos SomeOtherService) Print() { fmt.Println("SomeOtherService") }

func main() {
    s := FakeService{Client: SomeOtherService{}}
    s.PrintViaMethod()
}

为什么打印"PrinterService"?我要打印"SomeOtherService"

谢谢。


问题答案:

通过s.PrintViaMethod(),您正在调用 提升的
方法FakeService.Service.PrintViaMethod(),方法接收者将是FakeService.Service哪种类型Service,并Service.PrintViaMethod()调用Service.Client.Print()何处Service.Client是哪种类型PrinterService,这就是它打印的原因"PrinterService"

在Go中有嵌入,但是没有多态性。当您将类型嵌入结构中时,嵌入类型的方法将得到提升,并将成为嵌入类型的方法集的一部分。但是,当调用这种升级方法时,它将获得
嵌入值 作为接收者,而不是 嵌入者

要实现所需的功能,必须PrintViaMethod()通过为FakeService类型(带有FakeService接收者类型)提供其实现,并在其内部调用来“覆盖”该方法FakeService.Client.Print()

这样做s.PrintViaMethod()将表示该FakeService.PrintViaMethod()方法,因为该方法将位于PrintViaMethod()存在(而不是FakeService.Service.PrintViaMethod())的最浅深度。规格:选择器中对此进行了详细说明。

例如:

func (fs FakeService) PrintViaMethod() {
    fs.Client.Print()
}

然后输出将是(在Go Playground上尝试):

SomeOtherService


 类似资料:
  • 问题内容: 我有一些代码已经被转储并实际上被卡住了-之前我已经使用过RPC和JSON方面的东西,但是当它在本地运行良好时,我似乎无法使其在RPC上正常工作。 (也在这里,但没有可用的TCP!http: //play.golang.org/p/HmK-K09D2J ) 输出令人惊讶,因为它表明编组而不是实际数据出了点问题- 在Wireshark中运行它,我可以看到数据以正确的格式发送(我在另一个问题

  • 7.2. 接口类型 接口类型具体描述了一系列方法的集合,一个实现了这些方法的具体类型是这个接口类型的实例。 io.Writer类型是用的最广泛的接口之一,因为它提供了所有的类型写入bytes的抽象,包括文件类型,内存缓冲区,网络链接,HTTP客户端,压缩工具,哈希等等。io包中定义了很多其它有用的接口类型。Reader可以代表任意可以读取bytes的类型,Closer可以是任意可以关闭的值,例如一

  • 问题内容: 在Java中,您可以执行以下操作: 虽然这很好地解决了我一直在努力解决的问题,但与此有关的某些“感觉”是错误的。 我在这里犯一些讨厌的设计假舞曲吗? 问题答案: 不,您做对了。协变量返回仅指定该类及其下的类必须返回父类返回的原始常规类参数的特定子类。这也意味着您的子类仍与要求其返回Engine的原始接口兼容,但是如果您 知道 它是ICoolCar,则它具有ICoolEngine-因为更

  • 是否有方法更改在〈代码〉*中定义的接口属性的类型。d、 在typescript中? 例如:中的接口定义为 我想在我写入的typescript文件中更改它 甚至这样也行 这种方法有效吗?当我尝试我的系统时,它没有工作。只是想确认一下这是否可能?

  • 问题内容: 这是代码: 问题:代码可以编译并且一切正常。我想知道类Hello中的meth1()是否覆盖了哪个meth1()?接口中的ont或抽象类中的ont,为什么? 问题答案: 答案很简短:两者..... 实际上,是正确的:您不会 覆盖 任何一个,而是使用一种方法来 实现 它们两者。

  • 问题内容: 我偶然发现了对Java继承的好奇心,我希望您对此提出更好的想法: 假设两个接口A和A1 接口A1扩展了A 接口A具有返回泛型类型的方法。 通用类型将是。 现在的基本思想是将这种通用返回类型从接口A中更改 为 接口A1中的 一开始似乎很容易(不好的事情会在以后出现) 我们将接口A声明为 和接口A1一样 如您所见,我们被迫编写接口A本身,以允许使用基于泛型的“子类”覆盖它。(实际上,gen