赞
踩
在 Solidity 语言的多继承中,若多个合约
共同继承一个父合约
,则这多个合约
共享 父合约
中的变量和函数。
合约继承路线如下:
// SPDX-License-Identifier: GPL-3.0 // filename: authority.sol pragma solidity ^0.8.18; contract Authority { address private OWNER; mapping(address => bool) private ADMIN; constructor() { OWNER = msg.sender; ADMIN[OWNER] = true; // !注意,此处意为授予合约拥有者管理员权限 } modifier isOwner() { require(msg.sender == OWNER, unicode"非合约拥有者"); _; } // 修饰函数,被修饰的函数仅管理员才可调用 modifier isAdmin() { require(ADMIN[msg.sender] == true, unicode"无管理员权限"); _; } function addAdmin(address addrs) public isOwner { ADMIN[addrs] = true; } function removeAdmin(address addrs) public isOwner { ADMIN[addrs] = false; } }
// SPDX-License-Identifier: GPL-3.0 // filename: base.sol pragma solidity ^0.8.18; import { Authority } from "./authority.sol"; // 继承 Authority 合约,继而使用 isAdmin() 修饰函数 contract A is Authority { string a = "aaa"; // 仅管理员才可调用 getAstring() function getAstring() isAdmin public view returns (string memory) { return a; } } contract B is Authority { string b = "bbb"; function getBstring() isAdmin public view returns (string memory) { return b; } }
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.18;
import { A, B } from "./base.sol";
contract Test is A, B {
// 合约 Test 继承了 A 中的 a, getAstring() 以及
// B 中的 b, getBstring()
}
此时 合约 Authority
中的 构造函数 constructor()
中的 ADMIN[OWNER] = true
,意为 OWNER 具有管理员权限。
经 Remix 中测试,Test 合约的部署者具有管理员权限,能正常调用继承的函数,如下:
此步测试中将 合约 Authority
中的 构造函数 constructor()
中改为 ADMIN[OWNER] = false
,意为 用户 OWNER 没有了管理员权限,测试测试结果如下:
合约继承图:
虽然 合约 A,B,Test 都直接或间接继承了 合约 Authority,但是 合约 A,B,Test 都 “ 共享 ” 了 合约 Authority 中的 变量 ADMIN
,函数 isAdmin()
等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。