【Solidity】第5章第2回:継承(inheritance)の基礎

本記事では、Solidityにおける「継承」(inheritance)の基本を解説します。継承を利用することで、コードを効率的に再利用し、コントラクト設計をより洗練されたものにすることができます。
0. 記事の概要
この記事を読むメリット
- 継承の基礎理解:継承の概念とその利点を学べます。
- コードの再利用性向上:継承を使用してスマートコントラクトの効率的な構築が可能になります。
- スマートコントラクト設計力の向上:継承を活用した設計例を理解できます。
この記事で学べること
- 継承の基本構文とその用途
- 継承を使ったスマートコントラクト設計例
- よくあるエラーとその解決策
1. 継承(inheritance)とは?

1.1 継承の概要
継承とは、既存のコントラクトの機能や状態を、新しいコントラクトで再利用するための仕組みです。親コントラクトの関数や状態変数をそのまま使用でき、コードの重複を減らすことができます。
1.2 継承の基本構文
// 継承の基本例
contract Parent {
string public parentMessage = "This is the parent contract.";
function parentFunction() public pure returns (string memory) {
return "Function from Parent";
}
}
contract Child is Parent {
function childFunction() public pure returns (string memory) {
return "Function from Child";
}
}
動作解説
このコードでは、Child
コントラクトがParent
コントラクトを継承しています。Child
コントラクトからparentMessage
やparentFunction
をそのまま使用できます。
2. 継承を活用したスマートコントラクト設計

2.1 アクセス制御の実装
// 継承を利用したアクセス制御
contract Ownable {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Not the owner");
_;
}
}
contract Restricted is Ownable {
function restrictedFunction() public onlyOwner {
// オーナーのみが実行可能な処理
}
}
動作解説
このコードでは、Ownable
コントラクトを継承することで、Restricted
コントラクトにアクセス制御機能を追加しています。
2.2 トークンコントラクトの拡張
// トークンコントラクトを拡張
contract ERC20 {
mapping(address => uint256) public balances;
function transfer(address to, uint256 amount) public {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
balances[to] += amount;
}
}
contract MintableToken is ERC20 {
function mint(address to, uint256 amount) public {
balances[to] += amount;
}
}
動作解説
このコードでは、ERC20
コントラクトを継承し、新たにmint
関数を追加しています。
3. よくあるエラーとその解決策

3.1 コンストラクタの引数の継承
親コントラクトにコンストラクタがある場合、子コントラクトでその引数を指定する必要があります。
3.2 オーバーライドのミス
関数をオーバーライドする際に、override
キーワードを忘れるとエラーになります。適切に指定してください。
4. 練習問題
以下の課題に挑戦してみましょう:
- 基本的なERC20トークンコントラクトを継承して、焼却(burn)機能を追加してください。
- アクセス制御を持つ管理者コントラクトを作成してください。
5. まとめ
本記事では、Solidityにおける継承の基本的な使い方とその活用例について学びました。継承を効果的に利用することで、コードの再利用性を高め、堅牢なスマートコントラクトを構築できます。