Menu
Coddy logo textTech

デフォルトコンストラクタ

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 10/110。

クラス内でコンストラクタを定義しない場合、Dartは自動的にデフォルトコンストラクタを提供します。これは、単にクラスのインスタンスを作成する、引数のないコンストラクタです。

class Book {
  String title = 'Unknown';
  int pages = 0;
}

// Dartはデフォルトコンストラクタを提供します: Book()
Book myBook = Book();
print(myBook.title); // Unknown

デフォルトコンストラクタはコード内では見えませんが、存在します。これは引数を取らず、インスタンス変数に割り当てた任意のデフォルト値でオブジェクトを初期化します。

独自のコンストラクタを定義すると、デフォルトコンストラクタは自動的に提供されなくなります。パラメータ付きのコンストラクタと並行して引数なしのコンストラクタも必要な場合は、明示的に作成する必要があります:

class Book {
  String title;
  int pages;

  // 明示的なデフォルトコンストラクタ
  Book() : title = 'Unknown', pages = 0;

  // 引数付きコンストラクタ
  Book.withDetails(this.title, this.pages);
}

Book book1 = Book();                      // デフォルトを使用
Book book2 = Book.withDetails('Dart', 300); // 引数付きを使用

明示的なデフォルトコンストラクタは、初期化子リスト(コロンの後の部分)を使用して初期値を設定します。このパターンは、同じクラスからオブジェクトを作成する複数の方法を提供したい場合に便利です。

challenge icon

チャレンジ

簡単

暗黙的および明示的なデフォルトコンストラクタの両方を実演する、シンプルな製品在庫システムを構築しましょう。

コードを整理するために、2つのファイルを作成します。

  • product.dart: 製品を作成するための2つの方法を提供する Product クラスを定義します。
    • 初期化リストを使用して name'Unnamed' に、price0.0 に初期化する明示的なデフォルトコンストラクタ Product()
    • nameprice パラメータを受け取る名前付きコンストラクタ Product.withDetails
    • Product: [name] - $[price] と出力する display() メソッド
  • main.dart: 製品クラスをインポートし、2つの製品を作成します。
    • 1つはデフォルトコンストラクタを使用
    • もう1つは 'Laptop'999.99 を指定して名前付きコンストラクタを使用
    各製品に対して display() を呼び出します。

Product クラスには、2つのインスタンス変数が必要です。

  • String name
  • double price

期待される出力形式:

Product: Unnamed - $0.0
Product: Laptop - $999.99

チートシート

クラス内でコンストラクタが定義されていない場合、Dartは自動的にパラメータのないデフォルトコンストラクタを提供します。

class Book {
  String title = 'Unknown';
  int pages = 0;
}

Book myBook = Book(); // 暗黙のデフォルトコンストラクタを使用
print(myBook.title); // Unknown

独自のコンストラクタを定義すると、デフォルトコンストラクタは自動的に提供されなくなります。引数なしのコンストラクタとパラメータ化されたコンストラクタの両方を持たせるには、それらを明示的に作成する必要があります。

class Book {
  String title;
  int pages;

  // 初期化リストを使用した明示的なデフォルトコンストラクタ
  Book() : title = 'Unknown', pages = 0;

  // 名前付きコンストラクタ
  Book.withDetails(this.title, this.pages);
}

Book book1 = Book();                      // デフォルトを使用
Book book2 = Book.withDetails('Dart', 300); // 名前付きコンストラクタを使用

明示的なデフォルトコンストラクタは、初期値を設定するために(コロンの後の)初期化リストを使用します。

自分で試してみよう

import 'product.dart';

void main() {
  // TODO: デフォルトコンストラクタを使用して product を作成する
  
  // TODO: 'Laptop' と 999.99 を使用して名前付きコンストラクタで product を作成する
  
  // TODO: 各 product に対して display() を呼び出す
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン