【问题标题】:How does inheritance of variables work in Solidity?变量的继承在 Solidity 中是如何工作的?
【发布时间】:2023-01-25 07:10:19
【问题描述】:

继承在 Solidity 中究竟是如何工作的? 我有以下代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Golem {
    int public hp = 100;
    int internal attack = 20;
    int private attackMod = 2;

    function takeDmg(int dmg) public{
        hp = hp - dmg;
    }

    function attackBasic() public view returns(int){
        return attack * attackMod;
    }
}

contract FireGolem is Golem {}

我理解继承的方式是,基本上所有的代码都是在 FireGolem 中获取和“复制”的。 但是private变量有什么用呢?由于 private 变量“在派生合同中看不到”。

(使用混音) 如果我保持原样并部署 FireGolem,那么我可以调用 attackBasic 函数并获取值 40。所以看起来我可以访问 private 变量。

但是如果我在 FireGolem 中添加另一个函数:

function test() public view returns(int){
    return attack * attackMod;
}

然后我会得到一个错误,“未声明的标识符”,这意味着我无法访问该变量。

这里发生了什么?

【问题讨论】:

    标签: inheritance ethereum solidity


    【解决方案1】:

    子合约(FireGolem)不能直接访问父合约(Golem)的private变量。这是 Solidity 中 private 变量的基本特征(docs page 可见性)以及 OOP 中的一般特征。

    在这种特定情况下,您只能读取链上的值,因为父合约已经(某种程度上)定义了 private 变量的 public getter。如果没有attackBasic()函数,FireGolem合约将无法以任何方式访问attackMod

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-18
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      相关资源
      最近更新 更多