メインコンテンツまでスキップ

21 Constructor

constructor はコントラクトがデプロイされるときに一度だけ走る。

  • 状態変数を初期化したいときに使うことが多い
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

// Base contract A(constructor内含)
contract A {
string public name;

constructor(string memory _name) {
name = _name;
}
}

// Base contract B(constructor内含)
contract B {
string public text;

constructor(string memory _text) {
text = _text;
}
}

// 親コントラクトを継承したりする場合、constructorの使い方は2パターンある

// ①パラメーターをコントラクトに直接書くパターン
// こちらはハードコーディングしている
contract E is A("Input to X"), B("Input to Y") {

}

contract C is A, B {
// ②constructorにパラメーターを代入するパターン
// こちらはデプロイするときに引数として定義
string public name2;
string public text2;
constructor(string memory _name, string memory _text) X(_name) Y(_text) {
name2 = _name;
text2 = _text;
}
}

// constructorが呼ばれる順番はA, B, D
contract D is A, B {
// constructor()の後ろのA("X was called") B("Y was called")が書かれる順にかかわらず、constructorが呼ばれる順番はA, B, D
constructor() A("X was called") B("Y was called") {}
}

// constructorが呼ばれる順番はA, B, E
contract E is A, B {
constructor() B("Y was called") A("X was called") {}
}

tip

一個のファイルにコントラクトは何個あってもいいです。ただし、constructor はコントラクトごとに一個しか書けません。

Remixで試す