首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于继承线性化的问题

关于继承线性化的问题
EN

Ethereum用户
提问于 2018-12-04 20:49:36
回答 1查看 4.6K关注 0票数 7

如果我有以下继承:

代码语言:javascript
复制
pragma solidity ^0.4.24;

interface A {
    function foo(uint256 _x) external pure returns(uint256);
}

contract B1 is A {
    function foo(uint256 _x) public pure returns(uint256) { return _x + 1; }
}

contract B2 is A {

}

contract C_OK is B1, B2 {
    function foo(uint256 _x) public pure returns(uint256) { return super.foo(_x); }
}

contract C_NOT_OK is B1, A {
    function foo(uint256 _x) public pure returns(uint256) { return super.foo(_x); }
}

contract C_OK编译得很好,但是对于合同C_NOT_OK,我得到了一个

代码语言:javascript
复制
TypeError: Linearization of inheritance graph impossible
contract C_NOT_OK is B1, A {

我不太明白为什么这里会出现错误,但对于C_OK却没有,因为唯一的区别是C_OK从B2继承而不是从A继承,但是B2是空的,直接从A继承,所以C_OK和C_NOT_OK应该是等价的。

这里发生了什么事?

EN

回答 1

Ethereum用户

发布于 2018-12-05 04:34:17

当一种语言支持多重继承时,这就是“钻石问题”的一个实例。绘制继承图是不可能的。

Solidity使用称为C3线性化(https://en.wikipedia.org/wiki/C3_线性化)的方法,将继承的契约压平到最终结果中。正如您已经注意到的,您不能只是随意地抛出继承和“看看会发生什么”。

您最大的问题是稳定性要求继承按照一定的顺序(https://solidity.readthedocs.io/en/develop/contracts.html#multiple-inheritance-and-linearization)进行:

您必须按照从“最基本的”到“最派生的”的顺序列出直接基础合同。

因此,由于AB1“更像基”,如果您只是更改您的C_NOT_OK契约的继承顺序,它就会工作得很好。

票数 7
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/63564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档