Solidity之旅(十)OOP-抽象合約

BSN研習社發表於2023-12-14

抽象合約(abstractcontract)

前文在講合約繼承的基類建構函式的引數時,有提到抽象合約,也就是說,如果派生合約未能給其繼承的基合約指定建構函式引數時,那麼,該派生合約必須宣告為抽象合約(abstractcontract)。

我們知道Java中抽象類的定義,其一抽象類不能例項化,其二是抽象類中可以擁有抽象方法(是一種沒有方法體的、只有方法簽名的方法。)

而在Solidity中的抽象合約與Java的抽象類有異曲同工之妙。即假使合約中至少有一個函式沒有實現(沒有方法體,只有方法簽名的方法),那麼便將該合約定義為抽象合約(abstractcontract)。當然咯,前文說到繼承提到的,派生合約未能給其基合約的建構函式傳遞指定引數,這時,該合約便只能宣告為抽象的。

在Solidity0.8.x版本以上,抽象合約的抽象函式需加上virtual修飾,而對於的派生合約中的函式實現也得加上override修飾,否則編譯過不了。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
//base contract
abstract contract Animal  {
  function eat() virtual public ;
}
contract Bird is Animal {
   function eat() override public {
   }
}

undefined

假使派生合約未能給定所有基類的制定引數(基類建構函式的引數),那該合約也必須宣告為抽象的。

undefined

解決上圖所出現的問題,有兩種方式,要麼派生合約contractSnake給定所有基類建構函式的制定引數;要麼將派生合約Snake宣告為抽象(abstract)的。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
//base contract
contract Animal  {
  string public name;
   constructor(string memory _name){
      name = _name;
   }
}
//爬行動物是動物
contract Reptile {
   string public Rname;
   constructor(string memory _name){
      Rname = _name;
   }
}
abstract contract Snake is Reptile,Animal {
   //這是一隻眼鏡蛇 多個基類使用空格隔開
   constructor()  Animal("cobra"){}
}

undefined

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
//base contract
contract Animal  {
  string public name;
   constructor(string memory _name){
      name = _name;
   }
}
//爬行動物是動物
contract Reptile {
   string public Rname;
   constructor(string memory _name){
      Rname = _name;
   }
}
contract Snake is Reptile,Animal {
   //這是一隻眼鏡蛇 多個基類使用空格隔開
   constructor() Reptile("diba") Animal("cobra"){}
}
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
//base contract
contract Animal  {
  string public name;
   constructor(string memory _name){
      name = _name;
   }
}
//爬行動物是動物
contract Reptile {
   string public Rname;
   constructor(string memory _name){
      Rname = _name;
   }
}
contract Snake is Reptile,Animal {
   //這是一隻眼鏡蛇 多個基類使用空格隔開
   constructor() Reptile("diba") Animal("cobra"){}
}

undefined

若派生合約繼承自抽象合約,而並沒有去實現抽象合約中的抽象函式,那麼,該合約依然需要標記為抽象(abstract)的。

抽象合約將合約的定義與其實現脫鉤,從而提供了更好的可擴充套件性和自文件性,並消除了程式碼重複。

版權宣告:本文為CSDN博主「甄齊才」的原創文章,遵循CC4.0BY-SA版權協議,轉載請附上原文出處連結及本宣告。

原文連結:

https://blog.csdn.net/coco2d_x2014/article/details/128353622

文章來源:CSDN博主「甄齊才」

文章原標題:《玩以太坊鏈上專案的必備技能(OOP-抽象合約-Solidity之旅十)》

旨在傳播區塊鏈相關技術,如有侵權請與我們聯絡刪除。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70012206/viewspace-3000182/,如需轉載,請註明出處,否則將追究法律責任。

相關文章