Menu
Coddy logo textTech

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

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

totalDogs変数は共有されます。Dogオブジェクトがいくつ存在するかに関わらず、コピーは1つだけ存在します。インスタンスからではなく、クラス名Dog.totalDogsを使用してアクセスします。

challenge icon

チャレンジ

簡単

個別の展示への訪問数と博物館全体の統計の両方を追跡する、博物館の訪問者カウンターシステムを構築しましょう。

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

  • exhibit.dart: 博物館の展示を表す Exhibit クラスを定義します。各展示には以下を含める必要があります:
    • 展示の名前を保持するインスタンス変数 name (String)
    • その特定の展示を訪れた人数を追跡する、0 から始まるインスタンス変数 visitorCount (int)
    • すべての展示を通じた総訪問者数を追跡する、0 から始まる静的変数 totalVisitors (int)
    • 展示名を受け取るコンストラクタ
    • 展示の visitorCount とクラスの totalVisitors の両方をインクリメントする recordVisit() メソッド
    • 展示の情報を表示する displayStats() メソッド
  • main.dart: 展示クラスをインポートし、2つの展示を作成します:
    • 'Dinosaur Bones' 展示
    • 'Ancient Egypt' 展示
    Dinosaur Bones 展示に3回の訪問を記録し、次に Ancient Egypt 展示に2回の訪問を記録します。すべての訪問を記録した後、作成された順に各展示の 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]
}
quiz icon腕試し

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

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