今天的介紹可以說是[DAY16] (區塊鏈實作—用Solidity呼叫函數)的延伸,因為繼承和建構子有著微妙的關係,在許多程式語言裡面也都有繼承的概念,那在Solidity裡的繼承又有什麼樣的特性呢?對內容有興趣的歡迎一起看下去喔~~
當一個合約從多個合約繼承後,最後實際佈署上去的仍只有一個合約,那為什麼會有繼承的概念出現呢?其實是因為一份智慧合約裡面包含著很多合約,裡面有許多方法和屬性相同,如果把相同的合約寫在一起,變成父合約,然後透過其他子合約加入差異的地方並繼承,整份合約看起來也就輕鬆許多了。
在父合約定義modifier後,可以在子合約定義函數時進行呼叫
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract Practicetime4{
address owner;
constructor () public{
owner = msg.sender;
}
modifier onlyOwner{
require(msg.sender == owner);
_;
}
modifier costs(uint price){
if(msg.value >= price){
_;
}
}
}
當一個子合約的函數被宣告override時,表示它正在改變父合約的函數,即稱作「覆寫」。
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract A {
function foo() public pure virtual returns (string memory) {
return "A";
}
}
contract B is A {
function foo() public pure virtual override returns (string memory) {
return "B";
}
}
contract C is A {
function foo() public pure virtual override returns (string memory) {
return "C";
}
}
當一個合約被多個合約繼承時,透過super可以呼叫最初的父合約。
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
contract B {
uint public i;
function f() public virtual{
i = 1;
}
}
contract A is B{
function f() public virtual override{
i = 2;
}
}
contract C is A{
function f() public virtual override{
i = 3;
}
function f1() public{
super.f();
}
function f2() public{
A.f();
}
function f3() public{
B.f();
}
}
經過這幾天的實作,對Solidity慢慢開始有熟悉了,雖不及能夠獨立寫出一份完整合約的程度,在實作上要學的還很多,之後除了鐵人賽以外的時間我會在更深入學習研究的!
明天會是區塊鏈學習的最後一篇,也算是對區塊鏈下個總結。
今天的內容主要是Solidity訊息和編碼的介紹,感謝看到最後的你~~~
參考書籍:Solidity實戰全書
參考資料:
https://vocus.cc/article/61e80d66fd89780001a197b1
https://solidity-by-example.org/inheritance/