---
title: "什麼是 Solidity contract interface？"
description: "關於 Solidity smart contract interface，你需要知道的一切"
---

# 什麼是 Solidity contract interface？

**[Solidity](https://www.alchemy.com/overviews/solidity)** 是一種物件導向的高階語言，用於實作智能合約。在[用 Solidity 撰寫智能合約](https://www.alchemy.com/overviews/solidity-smart-contract)時，你可能會想使用介面（interface）與其他智能合約互動。了解如何使用介面，有助於加深你對 Solidity 語言的理解，也可能激發你對其他有趣的 Solidity 智能合約專案的想法。

本文將說明什麼是 Solidity 合約介面，並示範如何建立一個介面。我們也提供了一些介面實作與宣告的範例，供你撰寫時參考。

## **什麼是 Solidity 介面？**

**Solidity 合約介面是一份只有函式定義、沒有實作的清單。**換句話說，介面描述的是一個物件要能運作所必須具備的所有函式。介面會強制合約遵循一組定義好的屬性與函式。

Solidity 允許你在不擁有其程式碼的情況下，透過介面與其他合約互動。舉例來說，如果你想從自己的合約與另一個合約互動，可以用介面包裝來提供呼叫。透過宣告介面，你可以與其他合約互動，並[呼叫另一個合約中的函式](https://www.alchemy.com/overviews/solidity-call-another-contract)。

介面通常位於 Solidity 合約的最上方，並以「interface」關鍵字標示。由於介面能減少程式碼重複與開銷，因此在去中心化應用程式需要可擴充性、並希望避免複雜度時特別有用。

### **Solidity 介面的特性**

1. Solidity 介面可以繼承自其他介面
1. 合約可以像繼承其他合約一樣繼承介面
1. 你可以覆寫（override）介面函式
1. 介面內定義的資料型別可以被其他合約存取

所有繼承自介面的函式，凡是覆寫介面函式者，都必須設定 override 修飾詞，否則[Solidity 編譯器](https://www.alchemy.com/overviews/solidity-compiler)會拋出錯誤。

### **抽象合約 vs. 介面**

**抽象合約與介面是 web3 開發者用來建構更大、更複雜的分散式應用程式的兩種方式，因為它們讓 Solidity 具備可擴充性。**

抽象合約至少有一個函式缺乏實作，因此無法被編譯。不過，抽象合約可以作為基底合約，供其他合約繼承。

介面與抽象合約類似，但介面不能有任何已實作的函式。此外，介面僅限於合約的[應用二進位介面（Application Binary Interface, ABI）](https://www.alchemy.com/overviews/solidity-abi)所能表達的範圍。在 ABI 與介面之間轉換不會遺失任何資訊。

## **如何建立 Solidity 介面**

**介面通常位於程式最上方，並以「interface」關鍵字宣告。之後你可以用該介面與另一個合約溝通，或直接實作該介面。**

假設你正在撰寫一個智能合約錢包，程式碼可能會像這樣：

<ImageBlock
  src="https://media.alchemy.com/1703924327-how-to-create-a-solidity-interface.png"
  alt="如何建立 Solidity Interface"
  width={1346}
  height={894}
  caption="如何建立 Solidity Interface"
/>

注意這裡使用了「`is IWallet`」。在這個例子中，我們繼承了 `IWallet` 介面，並在我們的合約 `Wallet` 中實作它。

接著，如果你有某個智能合約想要能與錢包（此處為 `WalletFriendlyContract`）通訊，你可以重複使用這個介面：

<ImageBlock
  src="https://media.alchemy.com/1703924551-re-use-solidity-interface.png"
  alt="重複使用 Solidity interface"
  width={1548}
  height={894}
  caption="重複使用 Solidity interface"
/>

### Solidity 介面的規範

在 Solidity 中建立介面有一些限制，開發者應牢記以下主要的介面規範：

1. 介面不能有任何已實作的函式
1. 介面的[函式](https://www.alchemy.com/overviews/solidity-functions)只能是 external 型別
1. 介面不能宣告建構子（constructor）
1. 介面不能宣告狀態變數

## **Solidity 介面範例**

本節提供一些範例，協助你撰寫 Solidity 介面程式碼。

以下這段[介面程式碼範例](https://docs.soliditylang.org/en/v0.8.17/contracts.html#interfaces)取自**Solidity 官方文件**，建立了一個名為「Token」的介面，用來取得交易資訊。它包含一個函式，可用來存取來自其他合約的接收位址與轉帳金額等資訊。

<ImageBlock
  src="https://media.alchemy.com/1703924819-example-interface-code.png"
  alt="Interface 程式碼範例"
  width={1318}
  height={550}
  caption="Interface 程式碼範例"
/>

下一個[Solidity 介面範例](https://www.solidity-by-example.org/interface/)取自 **Solidity by Example**，展示了一個包含介面宣告與實作的完整合約。

<ImageBlock
  src="https://media.alchemy.com/1703924953-full-contract-with-interface-declaration-and-implementation.jpg"
  alt="包含 interface 宣告與實作的完整合約"
  width={1053}
  height={1600}
  caption="包含 interface 宣告與實作的完整合約"
/>

## **開始用 Alchemy 建構 Solidity 應用程式**

本文介紹了 Solidity 介面，並示範開發者如何運用介面在建構 Solidity 應用程式時節省時間、降低複雜度。若想[進一步學習 Solidity](https://www.alchemy.com/overviews/learn-solidity)，可參考 Alchemy University 的[免費 Ethereum 開發者訓練營](https://university.alchemy.com/?a=d3f70d2955)，這是一套為期 7 週、可自行安排進度的課程，說明 Solidity 開發的核心概念，內含大量程式挑戰、影片課程，以及精通 Solidity 的最佳資源。

如果開發者對開發領域完全陌生，Alchemy University 的**為期 3 週的 JavaScript 速成課程**，是進入 Ethereum 訓練營前的絕佳先修課程。
