2022-02-12|閱讀時間 ‧ 約 5 分鐘

智能合約開發實戰(六) - 繼承(Inheritance)與多重繼承

繼承是智能合約開發很常見也很重要的一種方法,繼承主要是子合約可以從父合約中繼承所有的屬性和方法。
為什麼需要繼承呢?因為如果有一個智能合約文件裡面有很多的合約,但合約裡面的很多屬性和方法都很相同,只有部份差異而已,這樣寫法就會很多餘,太多相同的了,如果有一個父合約,把相同的部份都寫在一起,然後其他子合約繼承這個父合約,然後子合約再加入自己差異的部份就好,這樣整份的智能合約看起來就會乾淨多了。
繼承寫法很簡單,就是在子合約後面加入"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,所以才會有五個項目出現,各位可以實作看看,能夠幫忙您加深印象,以上就是繼承和多重繼承的寫法,希望對您了解智能合約的繼承方面有幫忙。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享,謝謝。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.