【Flutter/Dart】クラスの基本を理解しよう!プロパティ/メソッド/コンストラクタ/インスタンス化

最終更新日

Dart_class

Flutterはクラスベースのフレームワークです。

ですのでクラスを理解しておかないといけません。

本記事では、fluterの基本となるクラスの扱い方・仕組みについて解説します。

クラス(class)について

クラスとは、

オブジェクト指向プログラミングにおけるクラス: class)[1]とは、オブジェクトを生成するための設計図あるいはひな形に相当するものである。抽象データ型の一つ。クラスから生成したオブジェクトの実体のことをインスタンスという。

https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%B9_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)

です。

このクラスを使ったプログラミング方法を

オブジェクト指向プログラミング(オブジェクトしこうプログラミング、object-oriented programming、略語:OOP)とは「オブジェクト」という概念に基づいたプログラミングパラダイムの一つである。 オブジェクトは、任意個数のフィールド 属性プロパティまたは変数)で構成されるデータと、任意個数の(メソッドまたは関数)で構成されるコードのひとまとまりで構成される。

https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0

といいます。

簡単にまとめると

オブジェクト(設計図)を使いインスタンス化(データを流し込み)しプロパティー(実際のデータ)をメソッド(関数)で処理する。

図で表すと以下のようになります。

サンプル

以下は一般的な簡略化したクラスになります。

クラスの定義

class Program={}

※クラス名をProgrmで定義

クラス名の先頭は大文字が推奨されています

インスタンス化

実際に作るもの。

class Program{}

void main(){
Program program = Program();
}

プロパティー

クラスが持つデータ。

class Program={
 String name='name';
}

メソッド

クラスが持つ関数。

class Program={
 String name='name';

 void main(){
  print('Dart is fun');
}
}

コンストラクタ

インスタンスを作成したタイミングで実行されるメソッドのこと

クラスのポイント

クラスには以下の4つの用語が出てきます。覚えましょう。

オブジェクト

「集合体」や「モノ」といった意味を持ちます。

プロパティー(実際のデータ)やメソッド(関数)を含めたものをオブジェクトといいます。

イメージは以下の通りです。

プロパティー

実際のデータです。

オブジェクトの設定や状態、属性などの情報をプロパティーといいます。

実際にインスタンス時、オブジェクトに追加されるデータです。

イメージは以下の通りです。

メソッド

オブジェクトをインスタンス化したときに実行できる関数のようなものです。

ここでメソッドを定義してあげることによりインスタンス化した時のプロパティーをどう扱えるのかが変わってきます。

イメージは以下の通りです。

インスタンス

「実態」という意味があります。

定義したオブジェクトにプロパティーを元に「実態」を作っていく作業です。

実際に、実態を作る作業をインスタンス化といいます。

イメージは以下の通りです。

コンストラクタ

コンストラクタを定義しなくても自動でデフォルトコンストラクタが作成されます。

newキーワード

コンストラクタを呼び出す際に、「new」キーワードは必要ありません。(使用することも可能です。)

private

Dartでは他の言語とは違い、アクセス制限をつけるのにpublic、protected、privateなどのキーワードを使いません

その代わりに、_(アンダーバー)を使用します。

アンダーバーを使用することによりprivateとなります

使用しない場合はpublicになります

main(){
  String _name;
}

getterとsetter

クラスにはgettersetterという概念があります。ただ、設定は必須ではありません。

使い方

  • Getter:クラス内の値を取得します.
  • Setter:クラス内の値を変更します.

なぜ利用するのか

処理時に期待しているデータと違うものが来た時にはじく機能を持ち合わせているので設定しておくことが推奨されています。

余談

実際に gettersetterがない言語として有名なのがpythonです。理由は、そもそもpythonのコンセプトが「簡単にプログラミングできるコード」なので上記のようになくても実際に動いてしまうので排除されている言語もあります。

サンプル

class Monster {
  int _number;
  String _name;
  
  Monster(this._number, this._name);

  // Getter
  int get number => _number;
  String get name => _name;

  // Setter
  set name(String s) {
    if (s.length > 0 && s.length < 5) {
     var errer='文字数を1文字以上文字以下にしてください。';
    } else {
   _name=s;
  }
}
}

void main() {
  final monster = Monster(1, 'あかさたなはまやらわ');
  monster.name='あかさたなはまやらわ';
  print(monster.number.toString() + ':' + monster.name);
}

https://zenn.dev/iwaku/articles/2020-12-09-iwaku

https://jpdebug.com/p/3064694

コンストラクタ

通常のコンストラクタ

サンプル

直接プロパティーを代入しない

直接プロパティーを代入する

名前つきコンストラクタ

名前付きコンストラクタについてはこちらで詳しくまとめています。

https://framework-book.com/flutter-dart/%e3%80%90dart%e3%80%91%e5%90%8d%e5%89%8d%e4%bb%98%e3%81%8d%e3%82%b3%e3%83%b3%e3%82%b9%e3%83%88%e3%83%a9%e3%82%af%e3%82%bf%e3%81%a8%e3%81%af%ef%bc%9f%e4%bd%bf%e3%81%84%e6%96%b9/

リダイレクトコンストラクタ

ファクトリーコンストラクタ 

ファクトリーコンストラクタはインスタンスを生成せずに、予め用意しておいたインスタンス(クラスの初期値)を返したい場合に使用します。

勉強していると、「インスタンス」と「オブジェクト」の違いが分からなくなることがよくあります。

そんな場合は、この章の最後のリンクをご覧ください。

https://zenn.dev/kaleidot725/articles/2021-11-13-dart-constructor

https://dev.classmethod.jp/articles/about_dart_constructors/

https://medium-company.com/%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88-%E9%81%95%E3%81%84/#:~:text=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AF%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E5%AE%9F%E4%BD%93,%E3%81%AF%E5%90%8C%E3%81%98%E3%82%82%E3%81%AE%E3%82%92%E6%8C%87%E3%81%99%E3%80%82

class User {
  final String imagePath;
  final String name;
  final String email;
  final String about;
  final bool isDarkMode;

  const User({
    required this.imagePath,
    required this.name,
    required this.email,
    required this.about,
    required this.isDarkMode,
  });
}

https://github.com/JohannesMilke/user_profile_ii_example/blob/master/lib/model/user.dart

参考

https://dart.dev/guides/language/language-tour#classes

fem