Dartの基本的な文法についてまとめました。
また、あやふやだったクラスやインスタンスなどの整理も同時に行いました。
オブジェクト
物。クラスやインスタンスをざっくりと表現するもの。
オブジェクト指向によってクラスやインスタンスが作られたので両方ともオブジェクトであると言えます。
オブジェクト = クラスとかインスタンスとかを説明するもの
ぐらいの認識でいいのではないでしょうか。自分はそうしてます。
モノの特性や動作の情報をまとめた箱みたいなもの。
特性をプロパティ、動作をメソッドと呼ぶ。
乃木坂46で、クラス・インスタンス・コンストラクタを理解する
クラス
インスタンスを生み出すための設計図。
クラス(乃木坂46や車、ポケモンなど概念的なもの)を設計図としてまとめておくことで効率良くインスタンス(白石麻衣やBMW、カイオーガ)を生み出します。
もう少し具体的に説明するとその概念の普遍的な特徴(ポケモンで言えば、名前やタイプ)をあらかじめ設計しておくことでいちいち個別に名前やタイプを定義し直すことなく、代入するだけで新たなポケモンを生み出します。
class Pokemon {
final String name; //名前
final String type; //タイプ
final String ability; //特性
final String stats; //個体値
Pokemon({this.pid, this.name, this.type, this.ability, this.stats});
//コンストラクタ
}
インスタンス
クラスから生み出されるオブジェクト。
コンストラクタ
初期化をし、インスタンスを生成する関数。
不思議なもので初期化して一旦まっさらな状態にしないと新しいポケモンが考えられないようです。
また、Dartではクラスと同じ名前のメソッドを宣言することでコンストラクタを宣言できます。
Pokemon({this.name, this.type, this.ability, this.stats});
この部分ですね。
クラスの継承
Dartはクラスとミックスインベースの継承を基本としたオブジェクト指向言語なので、全てのクラスは一つのスーパークラスを持ちます。
Dartではサブクラスはスーパークラス(継承元)のコンストラクタを呼び出すことはないので呼び出すにはsuper
を使用します。
みずタイプクラスからカイオーガを生成しようとすると多分こうなります。
class WaterType extends Pokemon {
WaterType(String name, String type, String ability, String stats) : super(String name, String type, String ability, String stats);
void attacks() {
print('ハイドロポンプ');
}
var kyogre = new WaterType('カイオーガ', 'みず', 'あめふらし', 'めっちゃ強い');
kyogre.attacks();
}
またサブクラスからスーパークラスのオーバーライド(上書き)をして新しくメソッドを定義し直すことも可能です。
class FireType extends WaterType {
FireType(String name, String type, String ability, String stats) : super(String name, String type, String ability, String stats);
@override
void attacks() {
print('ねっぷう');
}
var charizard = new FireType('リザードン', 'ほのお', 'もうか', '強い');
charizard.attacks();
}