继承ERC271合约有什么意义?
What is the point of inheriting from ERC271 contract?
我刚刚开始使用 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中声明函数名称和returns,就像我上面的例子一样?当我们已经在 myContract 中定义了所有功能内容时,ERC721 合约和让 myContract 继承自 ERC721 的意义何在?在前端工作时,我是从 myContract 还是从 ERC721 调用函数?
我希望我的问题很清楚,如果没有我可以在评论中澄清。预先感谢您的回复。
首先,您没有继承接口,而是实现它。在接口契约中,你不定义,你声明。您声明功能、输入和输出。
接口不能从具体(实际)契约继承。只有接口才能相互继承。仔细想想,具体的契约包含的信息比接口多,接口如何继承具体的契约?
一般来说接口是用户和程序之间的契约,对于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或智能合约的,而是关于面向对象编程、继承和接口的。我建议您多阅读它以更好地理解这个概念。
我刚刚开始使用 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中声明函数名称和returns,就像我上面的例子一样?当我们已经在 myContract 中定义了所有功能内容时,ERC721 合约和让 myContract 继承自 ERC721 的意义何在?在前端工作时,我是从 myContract 还是从 ERC721 调用函数?
我希望我的问题很清楚,如果没有我可以在评论中澄清。预先感谢您的回复。
首先,您没有继承接口,而是实现它。在接口契约中,你不定义,你声明。您声明功能、输入和输出。
接口不能从具体(实际)契约继承。只有接口才能相互继承。仔细想想,具体的契约包含的信息比接口多,接口如何继承具体的契约?
一般来说接口是用户和程序之间的契约,对于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或智能合约的,而是关于面向对象编程、继承和接口的。我建议您多阅读它以更好地理解这个概念。