未实现接口全部函数时,合约为何可通过接口定义实例化?
Solidity接口类型地址构造问题解答
1. 为什么传入未完全实现接口的合约地址能构造MainContract?
Solidity对接口类型的地址转换采用弱校验机制:
- 当你把一个合约地址赋值给接口类型变量时,编译器不会在编译阶段强制验证该合约是否实现了接口的所有函数。它只要求合约拥有你后续实际调用到的函数签名(参数、返回值、可见性需匹配)。
- 这个例子里,MainContract只是把传入的地址存为
MyInterface类型的变量,但并没有调用接口里的randomFunction(),所以构造过程不会出错。只有当你后续通过MainContract.ContractInherits调用randomFunction()时,才会触发运行时异常——因为目标合约根本没有这个函数,执行会直接失败。
2. ContractInherits是否实际继承了MyInterface?
没有。ContractInherits的代码里没有使用is MyInterface的继承声明,它只是碰巧定义了一个和接口同名的changeVariable()函数,但这不属于接口继承关系。如果要正式继承MyInterface,必须在合约声明时加上is MyInterface,并且强制实现接口的所有函数(否则编译阶段就会报错)。
内容的提问来源于stack exchange,提问作者Goober117
相关产品推荐
相关产品推荐

