继承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或智能合约的,而是关于面向对象编程、继承和接口的。我建议您多阅读它以更好地理解这个概念。