繼承是智能合約開發很常見也很重要的一種方法,繼承主要是子合約可以從父合約中繼承所有的屬性和方法。
為什麼需要繼承呢?因為如果有一個智能合約文件裡面有很多的合約,但合約裡面的很多屬性和方法都很相同,只有部份差異而已,這樣寫法就會很多餘,太多相同的了,如果有一個父合約,把相同的部份都寫在一起,然後其他子合約繼承這個父合約,然後子合約再加入自己差異的部份就好,這樣整份的智能合約看起來就會乾淨多了。
繼承寫法很簡單,就是在子合約後面加入"is"父合約的名稱就可以了,再來是帶參數的法式,方法也有很多種,我就簡單的二種帶參數的方式:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract A {
string public name;
constructor(string memory _name) {
name = _name;
}
function getContractName() public view virtual returns(string memory) {
return name;
}
//方法一:B繼承了A,然後直接用A帶參數
contract B is A("B") {
}
//方法二:C繼承了A,然後在constructor初始化內帶入參數
contract C is A {
constructor(string memory _name) A(_name) {
}
}
然後Deploy A,參數"_name"帶入"A",然後按Deploy
更換CONTRACT的下拉為"B - contracts/A.sol",按下Deploy,下面應該會出現B的地址
更換CONTRACT,參數"_name"帶入"This is C",然後按Deploy,下面應該會出現C的地址
展開就可以對其做操作了,跟上一篇的操作方法相同,由於發佈的是Local端,所以可以放心的操作,不用怕
上面是簡單的繼承和怎麼帶入參數,下面來講一下多重繼承
多重繼承的寫法和繼承也差不多,只是在於同一個合約可以同時繼承多個合約而已,寫法如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract A {
string public name;
constructor(string memory _name) {
name = _name;
}
function getContractName() public view virtual returns(string memory) {
return name;
}
}
contract B {
string public helloworld;
string public hellowworld2;
constructor(string memory _helloworld, string memory _helloworld2) {
helloworld = _helloworld;
hellowworld2 = _helloworld2;
}
function gethelloworld() public view virtual returns(string memory) {
return helloworld;
}
}
//C繼承了A也繼承了B, 及帶參數的方式
contract C is A, B {
constructor(string memory _name, string memory _helloworld, string memory _helloworld2) A(_name) B(_helloworld, _helloworld2) {
}
}
實作起來大概如下:
C contract同時會有A和B的屬性和方法,所以我們就直接看C就好了,從上圖可以看到,C可以帶入三個參數
從上圖實作出來的屬性和方法就可以看出,C contract同時繼承了A和B,所以才會有五個項目出現,各位可以實作看看,能夠幫忙您加深印象,以上就是繼承和多重繼承的寫法,希望對您了解智能合約的繼承方面有幫忙。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享,謝謝。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。