Dartについて学んでみる②

## 今回はあまり分かってなかったクラスについて学習
- クラスとは何か?
- プログラミングの専門用語では設計図という意味らしい?

**クラスの定義**

```dart
class クラス名{}
```
**クラスのインスタンス化**
```dart
void main() {
  final car = Car();
}

class Car {
  
}
```
**プロパティ（変数）の宣言・定義**
```dart
class Car {
  String? bland;
  int doors = 4;
}
```
プロパティは変数と同じように宣言・定義します。初期値を定義しない場合は「?」でnull safetyをオフにします。

**プロパティの呼び出し**
```dart
void main() {
  final car = Car();
  car.bland = "Toyota";

  print("ブランド:${car.bland}");
  print("ドアの数:${car.doors}");
}
class Car {
  String? bland;
  int doors = 4;
}
```
**メソッドの定義**
```dart
class クラス名 {
  void メソッド名(){
    処理
  }
}

```

**例**
```dart
void main() {
  final car = Car();
}

class Car {
  // void型は戻り値がない時に使う型。returnできない
  void driving() {
    print("運転中");
  }
}

```

**コンストラクタ（constructor）**
コンストラクタはクラスがインスタンス生成時に一度だけ実行されます。インスタンス生成時にパラメータ（引数）を受け取ったり、指定した処理を実行できます。

**コンストラクタの例**
```dart
void main() {
  final car = Car();
}

class Car {
  Car() {
    print("ドライブ行くよ!");
  }
}

```

クラスで宣言したプロパティをコンストラクタ・メソッドで使用する場合は、プロパティ名の前に「this.」をつけます。またパラメータありの関数と同じように扱います。

プロパティを宣言する際に「?」が必要です。（初期値を定義する場合を除く）

コンストラクタのパラメーターに直接プロパティを使用してコードを省略できます。

パラメーターを「{ }」で囲まない場合「?」は必要ありません。

```dart
void main() {
  final car = Car(driverName: "Alex", bland: "TOYOTA");
}

class Car {
  String? driverName = "Peter";
  String? bland = "不明";

  Car({this.driverName, this.bland}) {
    drive();
  }

  void drive() {
    print("運転手は$driverNameです。");
    print("車のブランドは「$bland」です。");
  }
}
```

**static修飾子の定義・呼び出し**

「static修飾子」を宣言したクラスのプロパティ・メソッドはクラスをインスタンス化せずに使用できるようになります。

```dart
void main() {
  Car.carType();
}

class Car {
  static const String brandName = "Toyota";

  static void carType() {
    print("$brandNameはメイドインジャパンです");
  }
}
```

**親クラスをクラス内で呼び出す（super）**

このsuperってのが理解できなかった(お恥ずかしい😅)
基礎文法への理解不足だな。文法への理解不足がアプリ開発をする際に、ビジネスロジックを考えることができない原因なのだろうな...
Swift勉強してたときにぶち当たった問題でした!!!

「super」を使えば親クラスのコンストラクタ・プロパティ・メソッドを継承クラスで呼び出して使用できます。
親クラスの「コンストラクタ」を継承クラスで呼び出す

```
継承クラス名(パラメータ) : super(パラメータ);
```
継承クラス内で親クラスのコンストラクタを呼び出すには上記のように書きます。
```dart
void main() {
  var child = Child("Jboy", 33);
  print("子供の名前は$child.name");
  print("年齢は$child.age歳。んっ子供じゃないぞ😅");
}

class Parent {
  String? name;
  int? age;
  Parent(this.name, this.age);
}

class Child extends Parent {
  // 親クラスのコンストラクターを呼び出す
  Child(String name, int age) : super(name, age);
}
```
出力結果
```dart
子供の名前はJboy
年齢は33歳。んっ子供じゃないぞ😅
```

## 列挙型(enum)
Enum型とは?
Enum型は定数の宣言やプログラムの設定などに便利な特別なデータ型です。
分かりやすくいうと定数が入ってるだけ。

Enum型の宣言にはenumというプレフィックスの後に、Enum型に与える変数名を与えます。

プレフィックスとは、接頭辞、前につける、などの意味を持つ英単語。 “prefix” の “pre” （「前」「先」などの意）のように、単語の先頭に付加して特定の意味を付け加える要素（接辞）のこと。

最近まで全然知らんかったわ!!!

**静的変数（static変数）のように値を取得**

```dart
void main() {
  Traffic traffic = Traffic(Colors.red);
  traffic.select();
}

enum Colors {
  red,
  yellow,
  blue,
}

class Traffic {
  // ここにEnum型を書く
  Colors colors;
  // ここにコンストラクターを書く
  Traffic(this.colors) {}

  void select() {
    // switch文使って選択をする
    switch (colors) {
      case Colors.red:
        print("赤信号です。危ないですよ!");
        break;
      case Colors.yellow:
        print("黄色信号です。注意しましょう!");
        break;
      case Colors.blue:
        print("青信号です。進行できます。");
        break;
    }
  }
}
```

実行結果
```dart
赤信号です。危ないですよ!
```

## static変数とメソッドに書き換えてみた
これがビジネスロジックを考えるということかな???
```dart
void main() {
  Traffic.colors;
  Traffic.caseMethod();
}

class Traffic {
  // static変数を書く
  static String colors = "yellow";
  // staticメソッドを書く
  static void caseMethod() {
    // switch文使って選択をする
    switch (colors) {
      case "red":
        print("赤信号です。危ないですよ!");
        break;
      case "yellow":
        print("黄色信号です。注意しましょう!");
        break;
      case "blue":
        print("青信号です。進行できます。");
        break;
    }
  }
}
```
実行結果
```dart
黄色信号です。注意しましょう!
```

## 使ってみた感想...
うん、確かにenum型の方が分かりやすいかもしれないですね。
定数を使う意味を理解した気がする。