Solidity之旅(十)OOP-抽象合約
抽象合約(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 { } }
假使派生合約未能給定所有基類的制定引數(基類建構函式的引數),那該合約也必須宣告為抽象的。
解決上圖所出現的問題,有兩種方式,要麼派生合約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"){} }
// 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"){} }
若派生合約繼承自抽象合約,而並沒有去實現抽象合約中的抽象函式,那麼,該合約依然需要標記為抽象(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Solidity語言學習筆記————35、抽象合約和介面Solid筆記抽象
- 智慧合約語言 Solidity 教程系列8 - Solidity APISolidAPI
- 智慧合約語言 Solidity 教程系列8 – Solidity APISolidAPI
- solidity投票智慧合約程式碼Solid
- 3.7 智慧合約與solidity簡介Solid
- solidity案例詳解(二)眾籌合約Solid
- Solidity之旅十七-庫 [library]Solid
- 智慧合約從入門到精通:Solidity AssemblySolid
- Solidity開發指南(六):合約結構解析Solid
- Solidity案例詳解(一)存錢罐合約Solid
- 智慧合約從入門到精通:Solidity組合語言Solid組合語言
- Solidity語言學習筆記————32、建立合約Solid筆記
- 用solidity語言開發代幣智慧合約Solid
- 如何建立一個Solidity智慧合約專案? - OliverSolid
- 智慧合約語言Solidity的最佳VSCode 外掛SolidVSCode
- ATourofEthereum——區塊鏈與智慧合約之旅區塊鏈
- 智慧合約最佳實踐 之 Solidity 編碼規範Solid
- 區塊鏈2.0以太坊智慧合約solidity之helloworld區塊鏈Solid
- DAPP代幣預售/智慧合約/NFT質押合約系統開發/Solidity編寫APPSolid
- 智慧合約語言 Solidity 教程系列1 – 型別介紹Solid型別
- 智慧合約語言 Solidity 教程系列9 - 錯誤處理Solid
- 用Solidity在Truffle上構建一個HelloWorld智慧合約Solid
- solidity智慧合約開發工具Atom及其外掛安裝Solid
- Defi/LP/DAPP代幣合約流動性質押挖礦系統開發/Solidity合約示例APPSolid
- 以太坊Solidity程式語言開發框架————4、編譯合約Solid框架編譯
- 以太坊Solidity程式語言開發框架————7、合約互動Solid框架
- 以太坊Solidity程式語言開發框架————8、測試合約Solid框架
- 如何用web3j編譯solidity智慧合約原始碼Web編譯Solid原始碼
- 以太坊智慧合約開發第五篇:字串拼接—Solidity字串Solid
- Solidity之旅(十八)內聯彙編 [inline assembly]Solidinline
- Solidity語言學習筆記————44、合約的後設資料Solid筆記
- solidity部分修飾符的使用以及合約的部分呼叫方法Solid
- 分投趣fintoch系統合約開發分析(Solidity程式語言)Solid
- 智慧合約語言 Solidity 教程系列10 - 完全理解函式修改器Solid函式
- 智慧合約從入門到精通:Solidity的特性與內部機制Solid
- 智慧合約從入門到精通:用Solidity開發一個“Hello World”Solid
- ADT & OOP-等價性OOP
- 開發者福利!不學Solidity也能在迅雷鏈開發智慧合約了Solid