当一个合约继承了另一个合约时,如果它重复定义了继承合约中已有的状态变量,则新合约中的变量将覆盖继承合约中的变量。这种现象被称为“状态变量的屏蔽”。
以下示例演示了如何通过继承来创建一个新合约,并在新合约中屏蔽继承合约中的状态变量。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
contract A {
uint256 public myUint = 1;
}
// B 继承自 A
contract B is A {
uint256 public myUint = 2;
}
A
合约定义了一个名为myUint
的状态变量,并将其设置为1
。B
合约继承了A
合约,并重新定义了名为myUint
的状态变量,并将其设置为2
。
使用 Remix 部署 B
合约并检索 myUint
的值。
我们可以看到,B
合约中重复定义的 myUint
变量的值为 2
,而继承自 A
合约的变量值仍为 1
。
- 在新合约中屏蔽继承合约中的状态变量可能会导致意外的行为。建议在编写代码时避免这种情况。