《Solidity笔记》抽象和接口

139 阅读2分钟

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. 总结

  • 抽象合约和接口都是定义合约功能的模版,有助于减少代码冗余。
  • 接口是智能合约的骨架,定义了合约的功能和如何与其交互。
  • 通过实现相同的接口,不需要了解具体合约的代码实现,就可以与其进行交互。