Dart における class とObject の使い方。

# Dartにおける class と object の使い方

[Classes](https://dart.dev/guides/language/language-tour#classes)

#### Creating a class (classを作成)
```Dart
class Car {
  int numberOfWindows = 5; 
  
  void drive(){
    print('wheels start turning');
  }
}
```

#### Creating an Object from the Class (objectをclassから作成)
```Dart
Car myCar = Car();
```


------
## 実際にclassとobjectを使ってCodeを書いてみましょう。
[Practice Here] (https://dartpad.dartlang.org/)

####1.各プロパティに、デフォルト値を設定したclassを作成するパターン

```Dart
void main(){
  // 2. class Carから, myNormalCar というObjectを作成。
  Car myNormalCar = Car(); 

  print(myNormalCar.numberOfSeat);　// 4 
}

// 1. Car という classを作る。
class Car {
  // デフォルトとして、numberOfSeatを4, yearCreatedを2020とする。
  numberOfSeat = 4; 
  yearCreated = 2020;
}

```

もし、毎回classを作成する度に、違うプロパティ値を表示させたいなら... => パターン2へ


#### 2.デフォルト値を設定せずに、classを作成するパターン(Constructorを使って)。

[Constructors](https://dart.dev/guides/language/language-tour#constructors)

```Dart
void main(){
  Car myNormalCar = Car(5, 2019);
  
  Car hisCar = Car(2, 2016); 
  
  print(myNormalCar.numberOfSeat); // 5
  print(myNormalCar.yearCreated); // 2019
  print(hisCar.numberOfSeat); // 2
  hisCar.whatToDo('Turn Left.'); // Turn Left
}
// Car classを作成。
class Car {
  // 1. デフォルト値を設定しない。
  int numberOfSeat;
  int yearCreated;
  // 2. Constructor method を使う。
  Car(int numberOfSeat, int yearCreated){
    // numberOfSeat は、Carというclassを作成する時に入力するように指示(thisは、Carというclassを指している)。
    this.numberOfSeat = numberOfSeat;
    this.yearCreated = yearCreated;
  }
  
  // 4. Methodを付け加える。
  void function(String whatToDo){
    print(whatToDo);
  }
}
```

上のコードはさらに、簡潔に入力できる。

```Dart
void main(){
  // 2. プロパティネームを入れずに、値のみ順番に入力すれば良い。
  Car myNormalCar = Car(5,2019);
  
  Car hisCar = Car(2,2016); 
  
  print(myNormalCar.numberOfSeat); // 5
  print(myNormalCar.yearCreated); // 2019
  print(hisCar.numberOfSeat); // 2

}
class Car {
  int numberOfSeat;
  int yearCreated;
  // {}を外す。
  Car(this.numberOfSeat, this.yearCreated);
}
```


#### 3. 既製されたclassの役割を、新たなclassに組み込む。
##### 1. まず、Car というclassを作成し、そのclassからnormalCarというObjectを作成。

```Dart
// まず、作成されたclassから、Objectを作成。
void main(){
  Car normalCar = Car();

  print(normalCar.numberOfSeat); // 5
  normalCar.drive(); // wheels turn.
  
}

// まず、最初のclassを作成。
class Car {
  int numberOfSeat = 5; 
  
  void drive(){
    print('wheels turn.');
  }
}

```

##### 2. Cαrというベースのclassを用いて、新たにElectricCar(Carに比べて、さらに機能を持つ)というclassを作成。

[Sub classing with extends](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Sub_classing_with_extends)

```Dart

void main(){
  Car normalCar = Car();

  print(normalCar.numberOfSeat); // 5
  normalCar.drive(); // wheels turn.

  ElectricCar myTesla = ElectricCar();
  myTesla.drive(); // wheels turn
  myTesla.recharge(); // 
  
}
class Car {
  int numberOfSeat = 5; 
  
  void drive(){
    print('wheels turn.');
  }
}

// Carより機能が多く搭載された、ElectricCarというclassを作成。
class ElectricCar extends Car {
  int batteryLevel = 100;
  
  void recharge(){ 
    batteryLevel = 100;
  }

}

```

#### 3. 既製されたclassのメソッドの一部を書き換える。

```Dart

void main(){
  // 新たなObjectを作成。
  LevitatingCar myMagLev = LevitatingCar();
  myMagLev.drive(); // glide forward
}

// 新たなclass(LevitatingCar: 既存のCarのメソッドを受け継ぐが、drive()が違う)を作成。
class LevitatingCar extends Car {
  
  // 既存の機能を書き換える
  @override 
  void drive(){ 
    print('glide forward');
  }
}

```

#### 4. 既存のメソッド(ここでは drive())に、更なる機能を付け加える。

[Super class calls with super](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Super_class_calls_with_super)

```Dart

void main(){
  // 新たなObject myWaymoを作成。
  SelfDrivingCar myWaymo = SelfDrivingCar('Osaka');
  
  myWaymo.drive(); // wheels turn. sterring towards Osaka.
}

// 最初のベースとなるclassを作成。
class Car {
  int numberOfSeat = 5; 
  
  void drive(){
    print('wheels turn.');
  }
}

// Carの機能を持つ、さらにパワフルなclass SelfDrivingCarというclassを作成。
class SelfDrivingCar extends Car {
  String destination;
  
  SelfDrivingCar(String userSetDestination){
    destination = userSetDestination;
  }
  
  @override
  void drive(){
    // drive()の機能に、新たな機能を付け加える。
    super.drive();
    
    print('sterring towards $destination');
  }
}


```






参照: The Complete 2020 Flutter Development Bootcamp with Dart.
(https://www.udemy.com/course/flutter-bootcamp-with-dart/learn/lecture/14483538#questions)