我正在学习一个教程。在那件事上,我把一份合同导入了另一份合同。然后,我使用导入的合约的名称作为数据类型名称来初始化一个数组。如何使用合同名称作为数据类型
import "./SimpleStorage.sol"; //importing another contract
contract StorageFactory {
SimpleStorage[] public simpleStorageArray ; //global variable
function createSimpleStorageContract() public {
SimpleStorage simpleStorage = new SimpleStorage();
simpleStorageArray.push(simpleStorage);
}
function sfStore(uint256 _simpleStorageIndex, uint256 _simpleStorageNumber) public {
SimpleStorage simpleStorage = simpleStorageArray[_simpleStorageIndex];
simpleStorage.store(_simpleStorageNumber);
}
function sfGet(uint256 _simpleStorageIndex) public view returns(uint256){
SimpleStorage simpleStorage = simpleStorageArray[_simpleStorageIndex];
return simpleStorage.retrieve();
}
}
合同和接口类型充当指向目标合同的指针。该代码假定目标合约实现了该类型的所有external
和public
函数。
在您的案例中,StorageFactory
假设存储在simpleStorageArray
阵列中的所有地址都实现了SimpleStorage
的接口。
因此,如果SimpleStorage
实现这个函数:get() external returns (uint256)
,StorageFactory
将期望这个函数返回一个长度为256位的二进制响应,然后将其转换为无符号整数。
文档:https://docs.soliditylang.org/en/v0.8.17/types.html#contract-类型