面向对象介绍
继承
- Solidity 支持多重继承包括多态
- 当一个合约从多个合约继承时,在区块链上只有一个合约被创建
- Solidity 的继承系统与 Python的继承系统 非常 相似,特别是多重继承方面
抽象合约
抽象合约可以包含已实现的函数也可以包含抽象函数,抽象函数是没有函数体的的函数。如果一个合约从一个抽象合约里继承,但却没实现所有函数,那么它也是一个抽象合约,如下
pragma solidity >=0.5.0 <0.7.0;
abstract contract Feline {
function utterance() public virtual returns (bytes32);
}
接口
接口类似于抽象合约,但是它们不能实现任何函数。还有进一步的限制
- 无法继承其他合约或接口。
- 无法定义构造函数。
- 无法定义变量。
- 无法定义结构体 无法定义枚举。
面向对象案例
面向对象需求分析
- 每个手机都有一样的开机与关机功能 (功能必须而且相同,那么此功能应该被抽取到父模块中)
- 每个手机都有闹钟功能,但不同品牌的手机闹钟设计不同 (功能必须但不相同,应该在父模块声明抽象函数,交给子类实现)
- 品牌手机实现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();
}
}