04_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();
     }
}

在这里插入图片描述

发布了131 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lsqzedu/article/details/104651009
今日推荐