Menu
Coddy logo textTech

実行時の型チェック

CoddyのDartジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 59/110。

ポリモーフィズム(多態性)により、オブジェクトをその親の型を通じて扱うことができますが、実行時にオブジェクトの実際の型を知る必要がある場合があります。これは実行時型チェックと呼ばれ、Dartはこの目的のために runtimeType プロパティを提供しています。

Dartのすべてのオブジェクトは、変数がどのように宣言されているかに関わらず、その実際の型を返すruntimeTypeプロパティを持っています:

class Animal {
  void speak() => print('Some sound');
}

class Dog extends Animal {
  @override
  void speak() => print('Woof!');
}

void main() {
  Animal myPet = Dog();
  
  print(myPet.runtimeType);  // 出力: Dog
}

myPetAnimal として宣言されていますが、実際に作成されたオブジェクトは Dog であるため、その runtimeTypeDog になります。これは、オブジェクトの実際の型に基づいて判断を行う必要がある場合に役立ちます。

void describeAnimal(Animal animal) {
  print('This animal is a ${animal.runtimeType}');
}

void main() {
  var pets = [Dog(), Cat(), Dog()];
  
  for (var pet in pets) {
    describeAnimal(pet);
  }
  // 出力:
  // This animal is a Dog
  // This animal is a Cat
  // This animal is a Dog
}

runtimeTypeは正確な型を教えてくれますが、主にデバッグやロギングに役立ちます。次のレッスンでは、コード内で型をチェックしたり操作したりするための、より実用的な方法を提供するis演算子とas演算子について学びます。

challenge icon

チャレンジ

簡単

runtimeType を使用して、さまざまな種類の車両を識別し、レポートする車両検査システムを構築しましょう。車両の階層構造を作成し、実行時に各車両の実際の型に関する情報を出力して検査する関数を作成します。

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

  • vehicles.dart: ここで車両の階層を定義します:
    • String model プロパティとコンストラクタを持つ Vehicle クラス。[model] is starting と出力する start() メソッドを含めます。
    • Vehicle を継承し、追加の int doors プロパティを持つ Car クラス。
    • Vehicle を継承し、追加の bool hasSidecar プロパティを持つ Motorcycle クラス。
    • Vehicle を継承し、追加の double cargoCapacity プロパティを持つ Truck クラス。
    また、1行目に Inspecting: [model]、2行目に Type detected: [runtimeType] と出力し、最後にその車両の start() メソッドを呼び出す関数 inspectVehicle(Vehicle vehicle) を作成します。
  • main.dart: 車両ファイルをインポートし、実行時の型チェックを実演します:
    • モデルが 'Sedan' でドアが 4 つの Car、モデルが 'Sportbike' でサイドカーが falseMotorcycle、モデルが 'Hauler' で積載量が 5000.0Truck を含む List<Vehicle> を作成します。
    • リストをループし、各車両に対して inspectVehicle() を呼び出します。
    • 各検査の間に空行を出力します(ただし、最後の検査の後には出力しません)。

すべての車両が List<Vehicle> に格納されているにもかかわらず、runtimeType プロパティによって実際の型(CarMotorcycle、または Truck)がどのように明らかになるかに注目してください。

期待される出力:

Inspecting: Sedan
Type detected: Car
Sedan is starting

Inspecting: Sportbike
Type detected: Motorcycle
Sportbike is starting

Inspecting: Hauler
Type detected: Truck
Hauler is starting

自分で試してみよう

import 'vehicles.dart';

void main() {
  // TODO: 以下を含む List<Vehicle> を作成してください:
  // - モデルが 'Sedan' でドアが4つの Car
  // - モデルが 'Sportbike' でサイドカーが false の Motorcycle
  // - モデルが 'Hauler' で積載量が 5000.0 の Truck
  
  // TODO: リストをループして、各車両に対して inspectVehicle() を呼び出してください
  // 各点検の間に空行を出力することを忘れないでください(ただし、最後の点検の後には不要です)
}
quiz icon腕試し

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

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

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