インスタンスメンバと静的メンバ
CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 17/110。
Dart のクラスでは、メンバー(変数とメソッド)は個々のオブジェクトに属することも、クラス自体に属することもあります。この違いを理解することは、コードを効果的に整理するうえで基本となります。
Instance membersは、作成する各オブジェクトに属します。各オブジェクトはInstance変数の独自のコピーを持ち、Instance methodはその特定のオブジェクトのデータを操作します。
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匹の犬の名前を変更しても、もう一方には影響しません。
Static membersは特定のオブジェクトではなく、class 自体に属します。すべてのインスタンス間で共有され、class 名を使用してアクセスします:
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:博物館の展示を表すExhibitclassを定義します。各展示には次のものを用意します。- 展示の名前を格納するinstance variable
name(String) - この特定の展示を訪れた人数を追跡する、
0から始まるinstance variablevisitorCount(int) - すべての展示の合計訪問数を追跡する、
0から始まるstatic variabletotalVisitors(int) - 展示の名前を受け取るConstructor
- 展示の
visitorCountとclassのtotalVisitorsの両方をincrementsするrecordVisit()method - 展示の情報をPrintする
displayStats()method
- 展示の名前を格納するinstance variable
main.dart:Exhibit classをimportし、2つの展示をCreateします。'Dinosaur Bones'展示'Ancient Egypt'展示
displayStats()をCallし、その後、すべての展示の合計訪問者数をPrintします。
displayStats() methodは、次のexact formatでPrintします。
[name]: [visitorCount] visitors合計訪問者数の行には、次をPrintします。
Total museum visitors: [totalVisitors]static variableには、class name Exhibit.totalVisitorsを使用してAccessします。
Expected output:
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5自分で試してみよう
import 'exhibit.dart';
void main() {
// TODO: Create a 'Dinosaur Bones' exhibit
// TODO: Create an 'Ancient Egypt' exhibit
// TODO: Record 3 visits to the Dinosaur Bones exhibit
// TODO: Record 2 visits to the Ancient Egypt exhibit
// TODO: 各exhibitに対して順番にdisplayStats()を呼び出す
// TODO: Print total museum visitors using 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まとめ:ジェネリックなストレージ自分で練習してみよう: Dartオンラインコンパイラ