面试题答案
一键面试方法集查找和调用规则
- 直接组合结构体的方法调用:
- 当调用
A
结构体实例的方法时,首先会在A
结构体自身的方法集中查找。如果找到了对应的方法,就直接调用该方法。 - 例如,
A
结构体有一个方法aMethod
,对于A
类型的实例a
,调用a.aMethod()
时,会直接执行A
结构体定义的aMethod
方法。
- 当调用
- 嵌套结构体的方法调用:
- 如果在
A
结构体自身方法集中未找到方法,会沿着结构体组合关系查找。例如A
组合了B
,会在B
结构体的方法集中查找。 - 比如
B
结构体有一个方法bMethod
,A
结构体实例a
可以通过a.B.bMethod()
来调用B
结构体的bMethod
方法。 - 如果
B
又组合了C
,当在A
和B
结构体方法集中都未找到方法时,会继续在C
结构体的方法集中查找。例如C
结构体有cMethod
,可以通过a.B.C.cMethod()
调用。
- 如果在
方法名冲突解决
- 同层级冲突:
- 如果在同一层级的结构体(如
A
和B
处于同一组合层级)中出现方法名冲突,编译器会报错。因为无法明确调用哪个方法。 - 解决方法是修改其中一个方法名,使其具有唯一性。例如将
A
结构体中的冲突方法名conflictMethod
修改为aConflictMethod
,B
结构体中的冲突方法名conflictMethod
修改为bConflictMethod
。
- 如果在同一层级的结构体(如
- 不同层级冲突:
- 当不同层级的结构体出现方法名冲突时,例如
A
结构体和B
结构体都有sameMethod
方法。调用a.sameMethod()
时,会调用A
结构体自身的sameMethod
方法,因为查找是从当前结构体开始,沿着组合关系向外查找,优先调用最近层级的方法。 - 如果想调用
B
结构体的sameMethod
方法,需要通过明确指定路径,如a.B.sameMethod()
。
- 当不同层级的结构体出现方法名冲突时,例如