---
title: 'Solidity WTF 101 14 單元'
lang: zh-tw
---
Solidity WTF 101 14 單元
===
:::info
:date: 2024/09/30
:::
[TOC]
# 課程學習
## 抽象合約與接口
### 抽象合約(abstract)
抽象合約是`abstract`,接口是`interface`。
假設我有一個函數缺少主題邏輯,那我必須聲明為`abstract`,否則會噴錯,且此函數因為沒有主體邏輯,所以也需要加上`virtual`讓繼承此抽象合約的合約去重新覆寫。
```xml=
<!-- 因為有未完成之 function 所以需要在合約加上 abstract 並在function加上 virtual -->
abstract contract InsertionSort{
function insertionSort(uint[] memory a) public pure virtual returns(uint[] memory);
}
contract sort is InsertionSort {
function insertionSort(uint[] memory a) public pure override {
<!-- 主體邏輯,function與抽象合約中的function不同只有virtual改成override -->
}
}
```
:::success
這邊要注意若實現了`abstrac`t合約中的`function`,把`virtual`改成`override`即可。
:::
### 接口(interface)
接口类似于抽象合约,但它不实现任何功能。接口的规则:
1. 不能包含状态变量
1. 不能包含构造函数
1. 不能继承除接口外的其他合约
1. 所有函数都必须是external且不能有函数体
1. 继承接口的非抽象合约必须实现接口定义的所有功能
在 `Solidity` 中,`interface` 是一种抽象合约,定义了一组必须被实现的函数,而不包含函数的具体实现。通过使用 `interface`,可以强制合约遵守某些标准接口,以确保不同合约之间能够通过一致的方式进行交互。
就如同不同國家溝通上可能因為語言關係會無法了解對方述說的意思,這是後就需要國際語言(interface)來解決這個問題。
```xml=
// 定义一个接口
interface MyInterface {
function setValue(uint256 _value) external;
function getValue() external view returns (uint256);
}
// 合约实现了该接口
contract MyContract is MyInterface {
uint256 private value;
// 实现接口中的 setValue 函数
function setValue(uint256 _value) external override {
value = _value;
}
// 实现接口中的 getValue 函数
function getValue() external view override returns (uint256) {
return value;
}
}
```
:::warning
本章節重點我認為是在interface上,他必須定義一個方法,並且如果要實現這種方法,必須遵守他的規定。這邊是我所這樣認為的。
:::