面向對象介紹
繼承
- 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();
}
}