06_Solidity面向對象編程

在這裏插入圖片描述


面向對象介紹

繼承

  1. Solidity 支持多重繼承包括多態
  2. 當一個合約從多個合約繼承時,在區塊鏈上只有一個合約被創建
  3. Solidity 的繼承系統與 Python的繼承系統 非常 相似,特別是多重繼承方面

抽象合約

抽象合約可以包含已實現的函數也可以包含抽象函數,抽象函數是沒有函數體的的函數。如果一個合約從一個抽象合約裏繼承,但卻沒實現所有函數,那麼它也是一個抽象合約,如下

pragma solidity >=0.5.0 <0.7.0;
abstract contract Feline {
    function utterance() public virtual returns (bytes32);
}

接口

接口類似於抽象合約,但是它們不能實現任何函數。還有進一步的限制

  1. 無法繼承其他合約或接口。
  2. 無法定義構造函數。
  3. 無法定義變量。
  4. 無法定義結構體 無法定義枚舉。

面向對象案例

面向對象需求分析

  1. 每個手機都有一樣的開機與關機功能 (功能必須而且相同,那麼此功能應該被抽取到父模塊中)
  2. 每個手機都有鬧鐘功能,但不同品牌的手機鬧鐘設計不同 (功能必須但不相同,應該在父模塊聲明抽象函數,交給子類實現)
  3. 品牌手機實現Wifi與BlueTooth,但有些老年機只實現Wifi或者BlueTooth (可選功能交給接口來實現)

在這裏插入圖片描述

面向對象實現

採用一個基於手機的OOP案例,整合了Solidity的封裝、繼承、多態、接口等概念,請注意oop的相關語法0.4與0.5以上的版本差異非常大,此處採用的是0.6最新版的語法來實現

pragma solidity >=0.5.0 <0.7.0;

interface Wifi{  // 接口的函數只有聲明沒有實現    
    function wifi() external returns (string memory);
}

interface BlueTooth{  // 接口的函數只有聲明沒有實現
    function blue() external returns (string memory);
}

abstract contract Phone{  // 父類,交給子類繼承

    event ShowCall(string); // 事件也支持繼承    

    function start() internal {
        emit ShowCall('調用開機功能');
    }

    function close() internal {
        emit ShowCall('調用關機功能');
    }
    
    function alarm() virtual internal;  // 抽象函數
    
}

contract Mi is Phone,Wifi{
    
    function alarm() internal override(Phone){
       emit ShowCall('小米實現了鬧鐘的功能'); // 調用父類函數
    } 
     // 指定實現的是哪個接口的函數
     function wifi() external override(Wifi) returns (string memory){
         return "小米實現WIFI功能";
     }
}

contract Iphone is Phone,Wifi,BlueTooth{
    
    function alarm() internal override(Phone){
       emit ShowCall('iphone實現了鬧鐘的功能'); // 調用父類函數
    } 
     // 指定實現的是哪個接口的函數(避免不同接口出現同一函數的情況)
     function wifi() external override(Wifi) returns (string memory){
         return "iphone實現WIFI功能";
     }
     
     function blue() external override(BlueTooth) returns (string memory){
         return "iphone實現藍牙的功能";
     }
     
     function callAlarm() public {
         alarm();
     }
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章