最近在看《自己动手写java虚拟机》这本书,跟着书敲代码,怎么敲出来和书上的结果不一样。。书上好像只实现了其中一个,就可以用接口类型代表类类型对象了。。。不知道怎么做到的
有疑问加站长微信联系(非本文作者)

最近在看《自己动手写java虚拟机》这本书,跟着书敲代码,怎么敲出来和书上的结果不一样。。书上好像只实现了其中一个,就可以用接口类型代表类类型对象了。。。不知道怎么做到的
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
base.NoOperandsInstruction
这个结构体应该实现了FetchOperands
这个方法没有啊,第二张截图就是它的方法了,只有Execute方法,没有FetchOperands
额,看错了,我再看一下,谢谢你的回复
一楼的是正解。你的NOP包含了base.NoOperandsInstruction,相当于已经实现了Instruction这个接口
是这样的,请问这是什么特性
你可以理解为继承
方法集的问题,类型有自己的方法集(也就是这个类型实现了那些方法),方法集会影响到接口实现规则 ,也就是说一个类型是否实现了某个接口,是根据这个类型的方法集来判断的。具体规则如下:
你这个例子里面 base.NoOperandsInstruction 作为 NOP 的匿名字段,从最后一张图上可以看到 nop 为指针类型,所以参考上面的第5条规则即可明白。
我去,等我重新写。上面的 * 号不见了
方法集的问题,类型有自己的方法集(也就是这个类型实现了那些方法),方法集会影响到接口实现规则 ,也就是说一个类型是否实现了某个接口,是根据这个类型的方法集来判断的。具体规则如下:
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条规则即可明白。
方法集的问题,类型有自己的方法集(也就是这个类型实现了那些方法),方法集会影响到接口实现规则 ,也就是说一个类型是否实现了某个接口,是根据这个类型的方法集来判断的。具体规则如下:
类型 T 方法集包含全部 receiver T 方法;
类型 T 方法集包含全部 receiver T + *T 方法;
如类型 S 包含匿名字段 T,则 S 方法集包含 T 方法;
如类型 S 包含匿名字段 T,则 S 方法集包含 S + T + *T 方法;
不管嵌入 T 或者 T,S 的方法集总是包含 S + *S + T + *T 方法;
你这个例子里面 base.NoOperandsInstruction 作为 NOP 的匿名字段,从最后一张图上可以看到 nop 为指针类型,所以参考上面的第5条规则即可明白。
好的,非常感谢,这是go的继承机制
这个是匿名组合,和继承类似,但是还是有区别。