@@ -15,6 +15,101 @@ timezone: UTC+8
1515## Notes
1616
1717<!-- Content_START -->
18+ # 2025-08-15
19+
20+ ### 继承与函数重写
21+
22+ Solidity支持单继承和多继承,子合约可重写父合约中的函数:
23+
24+ ``` solidity
25+ // 基础合约
26+ contract Animal {
27+ string public name;
28+
29+ constructor(string memory _name) {
30+ name = _name;
31+ }
32+
33+ function speak() public virtual returns(string memory) {
34+ return "Some sound";
35+ }
36+ }
37+
38+ // 继承合约
39+ contract Dog is Animal {
40+ constructor(string memory _name) Animal(_name) {}
41+
42+ // 重写父类函数
43+ function speak() public pure override returns(string memory) {
44+ return "Woof!";
45+ }
46+ }
47+
48+ // 多重继承
49+ contract Pet is Animal {
50+ address public owner;
51+
52+ constructor(string memory _name, address _owner) Animal(_name) {
53+ owner = _owner;
54+ }
55+ }
56+
57+ contract Labrador is Dog, Pet {
58+ constructor(string memory _name, address _owner)
59+ Dog(_name)
60+ Pet(_name, _owner) {}
61+ }
62+ ```
63+
64+ ### 接口与抽象合约
65+
66+ 接口与抽象合约用于定义规范与继承框架:
67+
68+ ``` solidity
69+ // 接口定义
70+ interface IERC20 {
71+ function transfer(address to, uint256 amount) external returns (bool);
72+ function balanceOf(address account) external view returns (uint256);
73+ }
74+
75+ // 抽象合约
76+ abstract contract AbstractToken {
77+ string public name;
78+
79+ // 没有函数体的抽象函数,必须被子类使用 override 关键词重载实现
80+ function totalSupply() public virtual returns (uint256);
81+
82+ // 有函数体实现的抽象函数,子类可以不使用 override 关键词重载直接继承已有的实现,也可以选择使用 override 关键词重载实现
83+ function decimals() public view virtual returns (uint8) {
84+ return 18;
85+ }
86+ }
87+ ```
88+
89+ ### 事件机制
90+
91+ 事件用于在链上记录重要状态变化,并可由外部监听器捕捉:
92+ ```
93+ contract EventExample {
94+ // 定义事件
95+ event Transfer(address indexed from, address indexed to, uint256 amount);
96+ event Approval(address indexed owner, address indexed spender, uint256 amount);
97+
98+ mapping(address => uint256) public balances;
99+
100+ function transfer(address to, uint256 amount) public {
101+ require(balances[msg.sender] >= amount, "Insufficient balance");
102+
103+ balances[msg.sender] -= amount;
104+ balances[to] += amount;
105+
106+ // 触发事件
107+ // 可以在区块链浏览器查找到当前事件记录
108+ emit Transfer(msg.sender, to, amount);
109+ }
110+ }
111+ ```
112+
18113# 2025-08-14
19114
20115## 2.合约结构详解
0 commit comments