如果我有以下继承:
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,我得到了一个
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应该是等价的。
这里发生了什么事?
发布于 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)进行:
您必须按照从“最基本的”到“最派生的”的顺序列出直接基础合同。
因此,由于A比B1“更像基”,如果您只是更改您的C_NOT_OK契约的继承顺序,它就会工作得很好。
https://ethereum.stackexchange.com/questions/63564
复制相似问题