接口有两个方法,只实现其中一个不算实现接口吧

Imstrong · 2018-04-25 09:47:39 · 1704 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2018-04-25 09:47:39 的主题,其中的信息可能已经有所发展或是发生改变。

最近在看《自己动手写java虚拟机》这本书,跟着书敲代码,怎么敲出来和书上的结果不一样。。书上好像只实现了其中一个,就可以用接口类型代表类类型对象了。。。不知道怎么做到的QQ图片20180425091639.pngQQ图片20180425094932.pngQQ图片20180425095005.pngQQ图片20180425095026.png


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1704 次点击  
加入收藏 微博
12 回复  |  直到 2018-04-25 17:10:31
abin
abin · #1 · 7年之前

base.NoOperandsInstruction 这个结构体应该实现了FetchOperands这个方法

Imstrong
Imstrong · #2 · 7年之前
abinabin #1 回复

`base.NoOperandsInstruction` 这个结构体应该实现了`FetchOperands`这个方法

没有啊,第二张截图就是它的方法了,只有Execute方法,没有FetchOperands

Imstrong
Imstrong · #3 · 7年之前
abinabin #1 回复

`base.NoOperandsInstruction` 这个结构体应该实现了`FetchOperands`这个方法

额,看错了,我再看一下,谢谢你的回复

ddxx11223
ddxx11223 · #4 · 7年之前

一楼的是正解。你的NOP包含了base.NoOperandsInstruction,相当于已经实现了Instruction这个接口

Imstrong
Imstrong · #5 · 7年之前
ddxx11223ddxx11223 #4 回复

一楼的是正解。你的NOP包含了base.NoOperandsInstruction,相当于已经实现了Instruction这个接口

是这样的,请问这是什么特性

ddxx11223
ddxx11223 · #6 · 7年之前
ImstrongImstrong #5 回复

#4楼 @ddxx11223 是这样的,请问这是什么特性

你可以理解为继承

smartwalle
smartwalle · #7 · 7年之前

方法集的问题,类型有自己的方法集(也就是这个类型实现了那些方法),方法集会影响到接口实现规则 ,也就是说一个类型是否实现了某个接口,是根据这个类型的方法集来判断的。具体规则如下:

  1. 类型 T 方法集包含全部 receiver T 方法;
  2. 类型 T 方法集包含全部 receiver T + T 方法;
  3. 如类型 S 包含匿名字段 T,则 S 方法集包含 T 方法;
  4. 如类型 S 包含匿名字段 T,则 S 方法集包含 S + T + T 方法;
  5. 不管嵌入 T 或者 T,S 的方法集总是包含 S + S + T + T 方法;

你这个例子里面 base.NoOperandsInstruction 作为 NOP 的匿名字段,从最后一张图上可以看到 nop 为指针类型,所以参考上面的第5条规则即可明白。

smartwalle
smartwalle · #8 · 7年之前

我去,等我重新写。上面的 * 号不见了

smartwalle
smartwalle · #9 · 7年之前

方法集的问题,类型有自己的方法集(也就是这个类型实现了那些方法),方法集会影响到接口实现规则 ,也就是说一个类型是否实现了某个接口,是根据这个类型的方法集来判断的。具体规则如下:

1、类型 T 方法集包含全部 receiver T 方法; 2、类型 T 方法集包含全部 receiver T + T 方法; 3、如类型 S 包含匿名字段 T,则 S 方法集包含 T 方法; 4、如类型 S 包含匿名字段 T,则 S 方法集包含 S + T + T 方法; 5、不管嵌入 T 或者 T,S 的方法集总是包含 S + S + T + T 方法;

你这个例子里面 base.NoOperandsInstruction 作为 NOP 的匿名字段,从最后一张图上可以看到 nop 为指针类型,所以参考上面的第5条规则即可明白。

smartwalle
smartwalle · #10 · 7年之前

方法集的问题,类型有自己的方法集(也就是这个类型实现了那些方法),方法集会影响到接口实现规则 ,也就是说一个类型是否实现了某个接口,是根据这个类型的方法集来判断的。具体规则如下:

  1. 类型 T 方法集包含全部 receiver T 方法;

  2. 类型 T 方法集包含全部 receiver T + *T 方法;

  3. 如类型 S 包含匿名字段 T,则 S 方法集包含 T 方法;

  4. 如类型 S 包含匿名字段 T,则 S 方法集包含 S + T + *T 方法;

  5. 不管嵌入 T 或者 T,S 的方法集总是包含 S + *S + T + *T 方法;

你这个例子里面 base.NoOperandsInstruction 作为 NOP 的匿名字段,从最后一张图上可以看到 nop 为指针类型,所以参考上面的第5条规则即可明白。

Imstrong
Imstrong · #11 · 7年之前
smartwallesmartwalle #8 回复

我去,等我重新写。上面的 * 号不见了

好的,非常感谢,这是go的继承机制

smartwalle
smartwalle · #12 · 7年之前
ImstrongImstrong #11 回复

#8楼 @smartwalle 好的,非常感谢,这是go的继承机制

这个是匿名组合,和继承类似,但是还是有区别。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传