从 ERC271 合约继承有啥意义?
Posted
技术标签:
【中文标题】从 ERC271 合约继承有啥意义?【英文标题】:What is the point of inheriting from ERC271 contract?从 ERC271 合约继承有什么意义? 【发布时间】:2021-11-13 14:18:42 【问题描述】:我刚刚开始使用 Solidity。对于这个问题,我认为如果我首先陈述我对继承的理解会很有用:如果合同 B 继承自合同 A(即在 contractB.sol 中我们有
contract B is A ...
那么合约 B 将可以访问合约 A 的功能。
另外,据我了解,如果我想使用其他人的其他合同中的某些功能,我的代码中会包含以下内容:
contract someoneElsesInterface
function someFunction() returns(something)
contract myContract
someoneElsesInterface someoneElsesContract = someonElsesInterface(address);
value = someoneElsesContract.someFunction();
我在尝试实施 ERC721 标准时出现了困惑。首先,我必须将 erc721.sol 文件保存在我的目录中;该文件包含
contract ERC721
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
function balanceOf(address _owner) external view returns (uint256);
function ownerOf(uint256 _tokenId) external view returns (address);
function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
function approve(address _approved, uint256 _tokenId) external payable;
然后在一个单独的文件中,我必须继承ERC721合约,然后定义balanceOf、ownerOf、transferFrom、approve这四个函数的内容;以及发出 Transfer 和 Approve 事件。所以如下:
contract myContract is ERC721
function balanceOf...
function ownerOf...
function transferrFrom...
...
这是我不明白的:为什么 ERC721 不是从 myContract 继承的,因为我们在 myContract 中定义函数,并且只在 ERC721 中声明函数名称和返回值,就像我上面的示例一样?当我们已经在 myContract 中定义了所有功能内容时,ERC721 合约和让 myContract 继承自 ERC721 的意义何在?在前端工作时,我是从 myContract 还是从 ERC721 调用函数?
我希望我的问题很清楚,如果不是,我可以在 cmets 中澄清。提前感谢您的回复。
【问题讨论】:
【参考方案1】:首先,您不继承接口,而是实现它。在接口契约中,您不定义,而是声明。您声明功能、输入和输出。
接口不能从具体(实际)合同继承。只有接口可以相互继承。仔细想想,具体的契约比接口包含更多的信息,接口怎么能继承具体的契约呢?
一般来说,接口是用户和程序之间的契约,Solidity 也是如此。它们向用户保证一定的功能。通过实施 ERC721,您声明您的合约与 ERC721 兼容。因此,用户不需要知道你的合约的实现细节,而是可以使用 ERC721 接口调用你的合约。
考虑以下:
ContractA ...
对
ContractB is ERC721 ...
假设两个合约都实现了 ERC721 功能。
为了能够调用 ContractA 进行 ERC721 交互,我必须导入它的 ABI 并验证它是否兼容。例如,我会这样称呼它:
ContractA(ADDRESS_OF_CONTRACT_A).safeTransferFrom(...)
另一方面调用ContractB,我只需要ERC721 ABI,我不需要知道ContractB。所以我可以这样做:
ERC721(ADDRESS_OF_CONTRACT_B).safeTransferFrom(...)
在我结束之前,我想强调一下,您的问题实际上并不是关于 Solidity 或智能合约,而是关于面向对象的编程、继承和接口。我建议您阅读更多内容以更好地理解该概念。
【讨论】:
以上是关于从 ERC271 合约继承有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章