1. 抽象合约
- 如果合约中有至少一个未实现的函数,则必须将合约标记为抽象合约。
- 未实现的函数需要标记为
virtual,以便子合约可以重写。
abstract contract InsertionSort {
function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);
}
2. 接口
- 接口类似于抽象合约,但不包含任何具体实现。
- 接口中的所有函数必须是
external,且不能包含函数体。
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function setApprovalForAll(address operator, bool _approved) external;
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
3. 使用接口的优势
- 通过实现相同的接口,不需要了解具体合约的代码实现,就可以与其进行交互。
- 接口定义了合约的功能和如何触发这些功能,使得与其他 DApp 和智能合约的交互更为简便。
contract InteractBAYC {
IERC721 private bayc = IERC721(0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D);
function balanceOfBAYC(address owner) external view returns (uint256 balance) {
return bayc.balanceOf(owner);
}
function safeTransferFromBAYC(address from, address to, uint256 tokenId) external {
bayc.safeTransferFrom(from, to, tokenId);
}
}
4. 总结
- 抽象合约和接口都是定义合约功能的模版,有助于减少代码冗余。
- 接口是智能合约的骨架,定义了合约的功能和如何与其交互。
- 通过实现相同的接口,不需要了解具体合约的代码实现,就可以与其进行交互。