函数定义、合约与面向对象(以太坊solidity合约)

函数定义、合约与面向对象(以太坊solidity合约)

1-函数定义、构造与多态

创建合约就是创建类,部署合约就是实例化

合约的方法还支持多态

还能使用第三方的库进行开发

整个合约部署后,函数就是代码的执行单元

https://learnblockchain.cn/docs/solidity/structure-of-a-contract.html#structure-functions

函数也是一种类型是值类型

pragma solidity >=0.6.1 <0.7.0;

// function (<parameter types>) {public private internal(默认)|external} [view|pure] [payable] [returns (<return types>)]
// 合约的函数支持多态(函数名称相同,参数类型或者数量不同)
contract FnDemo{
    
    string _name;  // 引用类型 + storage
    uint _age; // 值类型不存在Data Location
    
// 构造函数,合约在部署时自动调用,一般用来初始化状态变量
//deploy部署时,需要输入两个参数
    constructor(string memory name,uint age) public{
        _name = name;
        _age =age;
    }
   
    // private 仅仅在合约内部使用(所以合约部署后无法显示进行调用)
    // constant 0.4的版本使用,没有修改状态变量时可以设置,0.5版本使用View,Pure代替
    // view: 对状态变量(storage),只读但是不能写(状态变量部署会在账本,消耗gas)
    function getAll() private view returns (string storage,uint){
        return (_name,_age);
    }
    
// public: 公共函数(当前、其它、继承的子合约都能调用), 如果参数引用类型必须设置内存变量memory
//从理论上将每个智能合约只能修改自己的状态变量,而不能修改别人的,即自己的storage不能让别人修改,所以设置为memory 
// pure: 对状态变量不可读也不可写,在此函数中既没有操作状态变量,也没有读取

    function getAll(string memory name,uint age) public pure returns (string memory,uint){
         return (name,age+1);
    }
    
    // internal 受保护的函数,只能当前合约或者子合约调用
    // payable: 说明此方法有转账的操作,后面金额转账的操作比较多
    function getAll(string storage name) internal{
         getAll();  // 调用自己的private合约
    }
    
}

在这里插入图片描述

2-事件日志

Solidity无打印功能,调试不便

使用事件event和log日志

https://learnblockchain.cn/docs/solidity/structure-of-a-contract.html#event

通过事件写入日志

间接使用事件实现打印的功能

pragma solidity >=0.6.1 <0.7.0;

// solidity没有print,console.log方法,因此增加了调试的难度 ==> event + log来解决

contract LogTest{
    // 事件名称采用驼峰命名法
    event LogData(string,uint);
    
    event LogData(string,string);
    
    function show(string memory name,uint age) public{
        age = age + 1;// 此处实现业务操作
        emit LogData(name,age);
    }
    
    function show(string memory name,string memory age) public{
        emit LogData(name,age);
    }
}

在这里插入图片描述

这些日志也会随着合约的调用存储到分布式账本

如支付宝转账有备注,此日志也具有此功能,后续进行调用转账函数的时候,可以写日志的,一旦交易成功会跟随数据一起写入分布式账本中,交易往来

单机一个区块
有交易,合约交易(合约的创建、调用、销毁(以后合约不能再使用))
https://cn.etherscan.com/txsInternal?block=12548200

一般众筹完毕不再接受新的众筹金币,合约就会销毁

在这里插入图片描述
在这里插入图片描述

只要每笔交易确认,当前交易日志就会写到分布式账本(测试时解决打印难题)

3-面向对象特征

https://learnblockchain.cn/docs/solidity/contracts.html

Solidity多继承,python单继承

抽象合约,函数只有声明没有实现,交给自合约实现,抽象合约无法编译

https://learnblockchain.cn/docs/solidity/contracts.html#abstract-contract

库在后续课程实战调用第三方的库

好的需求,可维护,设计

pragma solidity >=0.6.0 <0.7.0;

// 手机OOP实现

// 每个手机都有一样的开机与关机功能

// 每个手机都有闹钟功能,但不同品牌的手机闹钟设计不同

// 品牌手机实现Wifi与BlueTooth,但有些老年机只实现Wifi或者BlueTooth.

interface Wifi{
    // external 说明当前函数只能被外界调用
    function wifi() external returns (string memory);
}

interface BlueTooth{
    // external 说明当前函数只能被外界调用
    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;//只有声明无实现(闹钟函数只能设计成抽象,每台手机对闹钟的实现各有不同,virtual 代表函数为抽象函数,solidity6)
}

继承抽象合约phone
contract Mi is Phone,Wifi{
    
//internal 不能被外界访问
    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('华为实现闹钟功能');
    }
    
    function wifi() external override(Wifi) returns (string memory){
        return "华为实现wifi功能";
    }
    
    function blue() external override(BlueTooth) returns (string memory){
        return "华为实现blueTooth功能";
    }
    
    function callAlarm() public{
        alarm();
    }
}

在这里插入图片描述

需要再回来好好的看看

返回华为实现了wifi功能

接口、抽象函数、抽象方法、乃至于实现

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 23:50:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 23:50:02       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 23:50:02       58 阅读
  4. Python语言-面向对象

    2024-07-16 23:50:02       69 阅读

热门阅读

  1. 开放开源开先河(一)

    2024-07-16 23:50:02       21 阅读
  2. 动态规划算法专题四--两个数组dp问题

    2024-07-16 23:50:02       20 阅读
  3. 如何检查对象中键是否存在?

    2024-07-16 23:50:02       22 阅读
  4. 【嵌入式】面试笔试问题整理 (持续更新)

    2024-07-16 23:50:02       22 阅读