Skip to content

learn_dart_oop

Uchijo edited this page Sep 8, 2022 · 3 revisions

クラス

みなさん、ここで人間を、プログラムで表現するとどうなるかを考えてみましょう。人間には

  • 身長
  • 性別
  • 名前
  • 人種

などいろいろあります。ここでは 人間は、「身長」、「性別」、「名前」 という3つのパラメータを持つとします。これをDartで書いてみましょう。

double sincho = 170.0;
String sex = 'M';
String name = 'Yuta Uchijo';

では、人間が2人いたらどう記述すればいいでしょうか?配列を利用してみると、次のように書けます。

List<double> sincho = [170.0, 182.0];
List<String> sex = ['M', 'F'];  
List<String> name = ['Yuta Uchijo', 'Kosuke Nakagawa'];

このように書くことができました。

ですが、実際の人間は、多くのパラメータを持ち、これからどんどん追加するかもしれません。長年運営するシステムで「人間」という情報を持つなら、需要に応じて人間の持つ情報の追加や削除が運用の中で発生します

例えば、人間が長ーいソースコードの中で何回(300回とか)も人間を定義している場合、それを全部直さないといけません。人間はミスする生き物です。どこかで追加や削除ミスが起きてプログラムが止まるなんてこともあり得ます。その修正、苦行ですよね?

こういうのを防ぐために、Dartなどのオブジェクト指向プログラミング言語では、一緒くたにしたいデータの束をまとめる「クラス」 という機能を提供しています。

class Human {
  double sincho;
  String sex;
  String name;

  Human(this.name, this.sex, this.sincho);
}

void main(){
  Human hito1 = Human('Yuta Uchijo', 'M', 180);
  Human hito2 = Human('Kosuke Nakagawa', 'M', 175);
}

これを見てみましょう。まずは、一番上の変数宣言。

double sincho;
String sex;
String name;

これは今までと変わりません。

コンストラクタ

クラスをソースコードの中で使う時は、

Human hito1 = Human(170.0, 'M', 'Uchijo Yuta');
Human hito2 = Human(182.0, 'F', 'Kosuke Nakagawa');

このように、型の名前のごとくクラス名を書いて、変数のように宣言します。では、代入はどうするのか?

普通の変数はint num = 4;のように、数字や文字列を直接書きます。この作ったHumanクラスの、いわばHuman型のデータは

Human(....)

のように作れます。ここで、....に何を入れればいいのか?実は、ここもHumanクラスを作った人がどうにでもカスタムできますし、それを定めたのがコンストラクタです

class Human {
  ...
  
  // ↓がコンストラクタ
  Human(this.name, this.sex, this.sincho);
}

書き方としては、クラス内の変数名の前に this.を付けて、 Human(...) に入れるだけです。

こうすることで、 Human hito1 = Human('Yuta Uchijo', 'M', 180); といったコードを実行するとHumanクラスを実際に使用することができるようになり、その中には Human(...) で指定した値が代入されるようになります。

データの取り出し方

このようにして作り出したHuman型のデータから実際にsinchoname,sexを取り出すのにはどうすれば良いのでしょうか?答えは簡単です。以下のように、データが入っている変数の直後に .を付け、その直後に取り出したいクラス内の変数名を書くだけです。

/// 取り出す対象のデータを定義
var hito1 = Human(300.0, 'M', '名無しの権兵衛');

/// 名前を取り出す
print(hito1.name); // 名無しの権兵衛 が出力される。

/// 性別を取り出す
print(hito1.name); // M が出力される。
Clone this wiki locally