Menu
Coddy logo textTech

インスタンスメンバと静的メンバ

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);  // 2

totalDogs変数は共有されています。Dogオブジェクトがいくつ存在しても、コピーは1つだけです。これはインスタンスではなく、クラス名Dog.totalDogsを通じてアクセスします。

challenge icon

チャレンジ

簡単

個々の展示の訪問数と博物館全体の統計情報の両方を追跡する訪問者カウンターシステムを作成しましょう。

コードを2つのファイルに整理します。

  • exhibit.dart:博物館の展示を表すExhibit classを定義します。各展示には次のものを用意します。
    • 展示の名前を格納するinstance variable name(String)
    • この特定の展示を訪れた人数を追跡する、0から始まるinstance variable visitorCount(int)
    • すべての展示の合計訪問数を追跡する、0から始まるstatic variable totalVisitors(int)
    • 展示の名前を受け取るConstructor
    • 展示のvisitorCountとclassのtotalVisitorsの両方をincrementsするrecordVisit() method
    • 展示の情報をPrintするdisplayStats() method
  • main.dart:Exhibit classをimportし、2つの展示をCreateします。
    • 'Dinosaur Bones'展示
    • 'Ancient Egypt'展示
    Dinosaur Bones展示への訪問を3回recordし、その後Ancient Egypt展示への訪問を2回recordします。すべての訪問を記録した後、作成したorderで各展示に対して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]
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Dartオンラインコンパイラ