インスタンスメンバと静的メンバ
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 17/110。
Dartのクラスでは、メンバー(変数やメソッド)は個々のオブジェクト、またはクラス自体のいずれかに属することができます。この違いを理解することは、コードを効果的に整理するための基本です。
インスタンスメンバは、作成する各オブジェクトに属します。すべてのオブジェクトはインスタンス変数の独自のコピーを持ち、インスタンスメソッドはその特定のオブジェクトのデータに対して動作します:
class Dog {
String name; // インスタンス変数
Dog(this.name);
void bark() { // インスタンスメソッド
print('$name says woof!');
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
dog1.bark(); // Buddy says woof!
dog2.bark(); // Max says woof!各 Dog オブジェクトは独自の name を持っています。1匹の犬の名前を変更しても、もう一方には影響しません。
静的メンバは、特定のオブジェクトではなく、クラス自体に属します。これらはすべてのインスタンスで共有され、クラス名を使用してアクセスされます:
class Dog {
String name;
static int totalDogs = 0; // 静的変数
Dog(this.name) {
totalDogs++;
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
print(Dog.totalDogs); // 2totalDogs変数は共有されます。Dogオブジェクトがいくつ存在するかに関わらず、コピーは1つだけ存在します。インスタンスからではなく、クラス名Dog.totalDogsを使用してアクセスします。
チャレンジ
簡単個別の展示への訪問数と博物館全体の統計の両方を追跡する、博物館の訪問者カウンターシステムを構築しましょう。
コードを2つのファイルに整理します:
exhibit.dart: 博物館の展示を表すExhibitクラスを定義します。各展示には以下を含める必要があります:- 展示の名前を保持するインスタンス変数
name(String) - その特定の展示を訪れた人数を追跡する、
0から始まるインスタンス変数visitorCount(int) - すべての展示を通じた総訪問者数を追跡する、
0から始まる静的変数totalVisitors(int) - 展示名を受け取るコンストラクタ
- 展示の
visitorCountとクラスのtotalVisitorsの両方をインクリメントするrecordVisit()メソッド - 展示の情報を表示する
displayStats()メソッド
- 展示の名前を保持するインスタンス変数
main.dart: 展示クラスをインポートし、2つの展示を作成します:'Dinosaur Bones'展示'Ancient Egypt'展示
displayStats()を呼び出し、最後にすべての展示の総訪問者数を出力します。
displayStats() メソッドは、次の正確な形式で出力する必要があります:
[name]: [visitorCount] visitors総訪問者数の行には、次のように出力します:
Total museum visitors: [totalVisitors]静的変数には、クラス名 Exhibit.totalVisitors を使用してアクセスしてください。
期待される出力:
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5チートシート
Dartのクラスメンバには、インスタンスメンバ(個々のオブジェクトに属するもの)と静的メンバ(クラス自体に属するもの)の2種類があります。
インスタンスメンバは各オブジェクトに固有です。すべてのオブジェクトは、インスタンス変数の独自のコピーを保持します。
class Dog {
String name; // インスタンス変数
Dog(this.name);
void bark() { // インスタンスメソッド
print('$name says woof!');
}
}静的メンバはすべてのインスタンスで共有され、staticキーワードを使用してクラス名を通じてアクセスされます:
class Dog {
String name;
static int totalDogs = 0; // 静的変数
Dog(this.name) {
totalDogs++;
}
}
// クラス名を通じて静的メンバにアクセスする
print(Dog.totalDogs); // 2静的変数は、作成されるオブジェクトの数に関係なく、単一の共有値を保持します。
自分で試してみよう
import 'exhibit.dart';
void main() {
// TODO: 'Dinosaur Bones' の展示を作成する
// TODO: 'Ancient Egypt' の展示を作成する
// TODO: Dinosaur Bones の展示に3回の訪問を記録する
// TODO: Ancient Egypt の展示に2回の訪問を記録する
// TODO: 各展示に対して順番に displayStats() を呼び出す
// TODO: Exhibit.totalVisitors を使用して博物館の総訪問者数を出力する
// Format: Total museum visitors: [totalVisitors]
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4Null Safety
Null Safety 入門Nullable と Non-Nullable? 演算子と ! 演算子late キーワードと Null SafetyNull-Aware 演算子クラスにおける Null Safetyまとめ:ユーザープロフィールシステム10コレクションとジェネリクス
List, Set, Map の概要型安全なコレクションジェネリッククラスジェネリックメソッドジェネリクスの制約Iterable と Iteratorまとめ:ジェネリックなストレージ