Dartにおけるクラスの高度な使い方

静的メンバーの利用

クラス内のメソッドやプロパティにstaticキーワードを付与することで、インスタンス化せずに直接クラス名からアクセスできるようになります。ただし、静的メソッド内ではインスタンスメンバーにアクセスできません。

class User {
  static String category = 'General';
  int id = 0;
  
  static void displayCategory() {
    print('Category: $category');
  }
  
  void printDetails() {
    print(category); 
    displayCategory();
  }
}

型キャスト演算子 as の使用

as演算子は、オブジェクトの型を明示的に変換する際に使用します。特にdynamic型の変数に対して特定のクラスのメソッドを呼び出す場合に有効です。

class Animal {
  String species = 'Unknown';
  void makeSound() {
    print('Some sound');
  }
}

void main() {
  dynamic creature;
  creature = 'Not an animal';
  creature = Animal();
  
  (creature as Animal).makeSound();
}

カスケード表記法(..)

同じオブジェクトに対して複数の操作を行う場合、カスケード表記法を使用するとコードが簡潔になります。

class Vehicle {
  String model;
  int year;
  
  Vehicle(this.model, this.year);
  
  void startEngine() {
    print('Engine started');
  }
}

void main() {
  var car = Vehicle('Sedan', 2020);
  
  car..model = 'SUV'
    ..year = 2023
    ..startEngine();
}

型チェック演算子 is

is演算子は、オブジェクトが特定の型であるかどうかを判定するために使用します。

class Device {
  String brand;
  void powerOn() {
    print('Device powered on');
  }
}

void main() {
  Device gadget = Device();
  
  if (gadget is Device) {
    gadget.brand = 'TechCorp';
  }
}

継承とコンストラクタの連携

サブクラスを作成する際、親クラスのコンストラクタに適切に引数を渡す必要があります。superキーワードを使用して親クラスの初期化を行います。

class Employee {
  String name;
  int employeeId;
  
  Employee(this.name, this.employeeId);
  
  void introduce() {
    print('Hello, I am $name');
  }
}

class Manager extends Employee {
  String department;
  
  Manager(String name, int id, this.department) : super(name, id);
}

void main() {
  var manager = Manager('Alice', 101, 'Engineering');
  print(manager.name);
}

メソッドのオーバーライド

サブクラスで親クラスのメソッドを再定義するには@overrideアノテーションを使用します。これにより、親クラスの機能を拡張または変更できます。

class Shape {
  void draw() {
    print('Drawing a shape');
  }
}

class Circle extends Shape {
  @override
  void draw() {
    print('Drawing a circle');
  }
  
  void callParentDraw() {
    super.draw();
  }
}

void main() {
  var circle = Circle();
  circle.draw();
  circle.callParentDraw();
}

タグ: Dart クラス 継承 静的メンバー 型キャスト

8月2日 17:15 投稿