浅析 solidity 接口
简述
solidity 的接口(interface),从名字来看,和其他语言的接口类似,只定义方法,不定义实现。类似下面
pragma solidity ^0.4.0;
interface interfaceContract {
function interfaceTestFunc() returns(string);
}
实例
注意:
1、在两个.sol文件中都声明接口,或者两个合约写到一个.sol文件里,那就只要声明一次;
2、在一个合约中实现METHOD_A,该合同必须继承自接口interfaceContract;
3、在另一个合约中创建一个interfaceContract实例,该实例接受实现接口的合约的地址;
4、通过这个实例调用目标合约的方法,获取目标合约的数据
合约实例
pragma solidity ^0.4.0;
interface interfaceContract {
function interfaceTestFunc() returns(string);
}
contract interContract is interfaceContract {
function interfaceTestFunc() returns(string) {
return "This is interfaceTestFunc";
}
}
这里interContract合约实现了接口interfaceContract的interfaceTestFunc方法
合约实例的调用
pragma solidity ^0.4.0;
interface interfaceContract {
function interfaceTestFunc() returns(string);
}
contract interTest {
function func(address _addr) public returns(string) {
interfaceContract _inter = interfaceContract(_addr);//_addr 是实现了interfaceContract接口的合约的地址,本例中指的是上面合约部署的地址,这个地方是接口调用的关键
return _inter.interfaceTestFunc();
}
}
将上面两个合约都部署到链上,使用interTest合约的func方法,将interContract合约的地址作为func 的参数传入,可以查看到输出 “This is interfaceTestFunc”
注意这里调用 func(address _addr)方法时,传递的参数_addr必须传递合约地址。并且这个合约地址是interfaceContract的实现类的合约地址。也就是第一步创建的interContract 合约的地址。如果传递的_addr参数错误,调用失败。它将回滚所有已执行的功能。也就是这个方法会回滚。
这里部署时,只需部署interTest 合约即可,不用管接口,接口只是为了声明。