Flutter入門-勉強メモ005-【Dartのクラスについてpart.1】

ここでは勉強していて少し混乱したクラスについてまとめてみました.

目次

クラス(Class)とは

クラス(Class)とは便利な機能をひとまとめにしたもので, そこでは変数や関数を定義することができます.

実際に簡単なクラスを作成し, その働きをみていきます.

void main() {
  
  Human taro = Human();

  print(taro.weight);
  
  taro.sayName();
  taro.sayHeight();
}

//Humanクラスの作成
class Human{
  String myName = '太郎'; 
  int age = 15;
  int height = 175;
  int weight = 70; 
  
  void sayName(){
    print('私の名前は$myNameです。');
  }
  
  void sayHeight(){
    print('私の身長は${height}cmです。');
  }
}

下のほうから見ていきます. まずはこの部分です.

//Humanクラスの作成
class Human{
  String myName = '太郎'; 
  int age = 15;
  int height = 175;
  int weight =70; 

class Human{***}でクラスを作成しています. その中で,

age(年齢), height(身長), weight(体重)

などの初期情報を記録しています.

次の2つはHumanクラスの中にある関数です. クラスの中にある関数をメソッド(method)と言います. 両方ともごく簡単なもので, それぞれ自分の名前と身長を出力します.

//自分の名前を言うメソッド
void sayName(){
  print('私の名前は$myNameです。');
}

//自分の身長を言うメソッド
void sayHeight(){
  print('私の身長は${height}cmです。');
  }

公式サイトでは,

Methods are functions that provide behavior for an object.

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

と説明されています. この説明からはクラスもオブジェクトも同じものに見えてきますね.

次に上のほうを見ていきます. この部分です.

void main() {

  Human taro = Human();

  print(taro.weight);
  
  taro.sayName();
  taro.sayHeight();
}

main関数の1行目

Human taro = Human();

ここで先ほど作成したHumanクラスの1つにtaroという名前をつけて使えるようにしています. これをクラスのインスタンス化とかクラスからインスタンスを生成するという言い方をします.

クラスは設計図のようなもので, taroはそのHuman設計図から実体化(インスタンス化)されたオブジェクトと考えることができます.

Everything you can place in a variable is an object, and every object is an instance of a class

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

オブジェクトはクラスのインスタンスを生成しないと使えません.

続いて2行目です.

print(taro.weight);

Humanクラスはweightという変数を持っているのでそれを出力しています. 今の場合は「70」が出力されます.

クラス内の変数をインスタンス変数, または, フィールドプロパティと言います.

Instance variables are sometimes known as fields or properties.

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

次の2つ

taro.sayName();
taro.sayHeight();

は両方ともメソッドで, それぞれ

  • 「私の名前は太郎です。」
  • 「私の身長は175cmです。」

と出力されます.

インスタンスの初期化(コンストラクタ)

Humanクラスではさまざまなインスタンスを作ることができます. 例えば, 太郎くんを作ることもできれば次郎くんや花子さんも作ることがきでます.

その際,

Human taro = Human();
Human jiro = Human();
Human hanako = Human();

として, インスタンスを生成しても

print(taro.weight);
print(jiro.weight);
print(hanako.weight);

で出力させるのはすべて「70」になります.

Flutter

これでは困るので, インスタンスごとに初期値を設定します. この初期化部分をコンストラクタと言います.

コンストラクタとは、クラスからインスタンスを作成した際に, 自動的に実行されるメソッドのことです. インスタンス変数の初期化などを行います.

実際には次のように記述します.

void main() {
  
  Human taro = Human(myName: 'taro', height: 175);

  print(taro.height);
  
  taro.sayName();
  taro.sayHeight();
}

//Humanクラスの作成
class Human{
  
  String myName; 
  int height;

  Human({this.myName, this.height});
  
  void sayName(){
    print('私の名前は$myNameです。');
  }
  
  void sayHeight(){
    print('私の身長は${height}cmです。');
  }
}

Dartのコンストラクタはクラスと同じ名前になります.

Human({this.myName, this.height});

これが呼び出されることによって, myNameやheightは初期化され, 値を代入することができます. 上のコードは,

Human({myName, height}){
    this.myName = myName;
    this.height = height;
  }

と書くものを省略した形になっています. thisというキーワードは現在のインスタンスを参照にしています. クラスを初期化した際, クラス内で設定した値(インスタンス変数)を代入することがほとんどです. したがって, このように省略した書き方が存在します.

クラスにはこの他,

  • 継承(Inheritance)
  • ポリモーフィズム(Polymorphism)

など大切な考え方があり, これはまた次の機会に譲りたいと思います.

コメント

コメントする

目次
閉じる