【Flutter/Dart】クラスの定義

目次

概要

オブジェクト指向の基礎中の基礎。これはいわゆる設計図に値する。
クラスを使うことでプログラムのファイルを分割できるし、なにより変数の管理がとても楽になる。
今後、メンテナンスしやすいソースコードをかけるようになるためにきちんと理解しよう。

詳細

クラスの生成

クラスを生成する場合は以下の書き方が基本形になる。

class /* クラス名 */ {
  // 変数宣言
       :
       :

  // コンストラクタ生成
  /*クラス名*/(this./* 変数名 */, this./* 変数名 */, ...);

  // メソッド定義
  /* メソッドの型 */ /* メソッド名 */(/* メソッドの引数 */, /* メソッドの引数 */, ...) {
    /* 実行したい処理 */
  }
}

今回は以下のようになっている。

class TrumpCard {
  bool isSelected;
  int number;
  String mark;

  TrumpCard(this.isSelected, this.number, this.mark);

  void tap() {
    print("-------- start tap() --------");
    print("カードを選択された");
    print("-------- end tap() --------");
  }
}
項目設定内容
クラス名TrumpCard
変数宣言bool isSelected;
int number;
String mark;
コンストラクタTrumpCard(this.isSelected, this.number, this.mark);
メソッド
メソッドの型void(処理を行うだけ(戻り値がない))
メソッド名tap
メソッドの引数なし
実行したい処理print(“——– start tap() ——–“);
print(“カードを選択された”);
print(“——– end tap() ——–“);

では、それぞれが何の役割を表すのかを見ていこう。

変数宣言部分

これは、このクラスが持つ変数。
例えばだが、今回のようにトランプの特徴を表すだけでも複数のデータが必要なことがわかると思う。(以下にあるが、これが全てではない)

  • トランプの数字
  • トランプのマーク
  • トランプが表になっているか裏になっているか

でも、いちいちこれらの変数をいくつも用意するのはソースコードも読みづらくなるし、新しく変数を追加したい時にすごく手間がかかる。

だからこそ、クラスという「設計図」にして、それを元にオブジェクトを作るようにしている。

コンストラクタ

設計図だけでは何にもならない。家の設計図があっても住めないのと同じように、クラスという「設計図」だけではプログラム上で使うことはできない。
なので設計図を元に家を建てるように、プログラムでもクラスを実体化することが必要になる。

そして、実体化する時にクラス内で宣言した変数の中身を設定することが必要になる。
なので、以下のようにしてコンストラクタを呼び出して変数に値を設定しながら実体化させよう。

var /* オブジェクト名 */ = /* 実体化するクラス名 */(/* 変数の設定値 */, /* 変数の設定値 */, ...);

今回の例は以下のようになっている。

var trump = TrumpCard(false, 1, "spade");
項目設定内容
オブジェクト名trump
実体化するクラス名TrumpCard
変数の設定値以下のように設定
bool isSelected → false
int number → 1
TrumpMark mark → ”spade”

また、この変数を使う時は以下のように書くことで変数と同じように使うことができる。

/* オブジェクト名 */./* 変数名 */

例として、以下のように書く。

trump.number

日本語にすると、オブジェクト「trump」の中( . )の変数「number」ということ。
このひとまとまりで変数のように扱える。

メソッド

メソッドとは、一つの処理の塊。
何行にもわたる処理をプログラムのあちらこちらに書くのは煩雑になるし、一箇所変更したら全部を一つ一つ変更する必要が出てくるし、何よりもバグの原因にもなる。

だからこそ、以下のようにメソッドを定義して処理のまとまりを定義しておこう。

/* メソッドの型 */ /* メソッド名 */(/* メソッドの引数 */, /* メソッドの引数 */, ...) {
  /* 実行したい処理 */
}

今回の例では以下のようになっている。

void tap() {
  print("-------- start tap() --------");
  print("カードを選択された");
  print("-------- end tap() --------");
}

また、呼び出す時は以下のようにできる。

trump.tap()

ちなみに、メソッドを呼ぶということは、上記の「trump.tap()」は以下のように書くのと同じということ。つまり、以下の3行が1行になっている。

print("-------- start tap() --------");
print("カードを選択された");
print("-------- end tap() --------");

参考ページ

  • 特になし