3-6.Dartの継承とポリモーフィズム

1. 継承とは

継承は、既存のクラス(親クラスまたはスーパークラス)のプロパティとメソッドを新しいクラス(子クラスまたはサブクラス)に引き継ぐための仕組みです。継承を使用することで、コードの再利用性を高め、オブジェクト指向プログラミングの設計が容易になります。

基本的な継承

Dartでは、extendsキーワードを使用して継承を実現します。

Dart
class Animal {
  String name;

  void eat() {
    print('$name is eating.');
  }
}

class Dog extends Animal {
  void bark() {
    print('$name is barking.');
  }
}

void main() {
  Dog dog = Dog();
  dog.name = 'Buddy';
  dog.eat(); // Buddy is eating.
  dog.bark(); // Buddy is barking.
}

2. ポリモーフィズムとは

ポリモーフィズム(多態性)は、異なるクラスのオブジェクトを同じインターフェースで操作できる能力を指します。これにより、コードの柔軟性と拡張性が向上します。

ポリモーフィズムの基本

ポリモーフィズムは、親クラスの型を使用して子クラスのオブジェクトを扱うことで実現されます。

Dart
class Animal {
  void makeSound() {
    print('Some generic animal sound');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Bark');
  }
}

class Cat extends Animal {
  @override
  void makeSound() {
    print('Meow');
  }
}

void main() {
  Animal myDog = Dog();
  Animal myCat = Cat();

  myDog.makeSound(); // Bark
  myCat.makeSound(); // Meow
}

3. 親クラスのコンストラクタの呼び出し

子クラスのコンストラクタから親クラスのコンストラクタを呼び出すには、superキーワードを使用します。

親クラスのコンストラクタの呼び出し

Dart
class Animal {
  String name;

  Animal(this.name);
}

class Dog extends Animal {
  String breed;

  Dog(String name, this.breed) : super(name);

  void displayInfo() {
    print('Name: $name, Breed: $breed');
  }
}

void main() {
  Dog dog = Dog('Buddy', 'Golden Retriever');
  dog.displayInfo(); // Name: Buddy, Breed: Golden Retriever
}

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

子クラスは親クラスのメソッドをオーバーライドして独自の実装を提供することができます。オーバーライドには、@overrideアノテーションを使用します。

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

Dart
class Animal {
  void makeSound() {
    print('Some generic animal sound');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Bark');
  }
}

void main() {
  Animal animal = Animal();
  animal.makeSound(); // Some generic animal sound

  Dog dog = Dog();
  dog.makeSound(); // Bark
}

5. 抽象クラス

抽象クラスは、直接インスタンス化できないクラスです。抽象クラスは、他のクラスが継承するための基本的な構造を提供します。抽象クラスはabstractキーワードで定義されます。

抽象クラスの使用

Dart
abstract class Animal {
  void makeSound(); // 抽象メソッド
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Bark');
  }
}

class Cat extends Animal {
  @override
  void makeSound() {
    print('Meow');
  }
}

void main() {
  Animal myDog = Dog();
  Animal myCat = Cat();

  myDog.makeSound(); // Bark
  myCat.makeSound(); // Meow
}

6. 例題

例題1: 基本的な継承

Dart
class Vehicle {
  String brand;

  void honk() {
    print('$brand is honking.');
  }
}

class Car extends Vehicle {
  int doors;

  Car(this.brand, this.doors);

  void displayInfo() {
    print('Brand: $brand, Doors: $doors');
  }
}

void main() {
  Car car = Car('Toyota', 4);
  car.honk(); // Toyota is honking.
  car.displayInfo(); // Brand: Toyota, Doors: 4
}

例題2: ポリモーフィズムの使用

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

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

class Square extends Shape {
  @override
  void draw() {
    print('Drawing a square');
  }
}

void main() {
  Shape shape1 = Circle();
  Shape shape2 = Square();

  shape1.draw(); // Drawing a circle
  shape2.draw(); // Drawing a square
}

例題3: 親クラスのコンストラクタの呼び出し

Dart
class Animal {
  String name;

  Animal(this.name);

  void makeSound() {
    print('$name makes a sound.');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);

  @override
  void makeSound() {
    print('$name barks.');
  }
}

void main() {
  Dog dog = Dog('Buddy');
  dog.makeSound(); // Buddy barks.
}

例題4: 抽象クラスの使用

Dart
abstract class Appliance {
  void turnOn();
  void turnOff();
}

class WashingMachine extends Appliance {
  @override
  void turnOn() {
    print('Washing machine is now on.');
  }

  @override
  void turnOff() {
    print('Washing machine is now off.');
  }
}

class Refrigerator extends Appliance {
  @override
  void turnOn() {
    print('Refrigerator is now on.');
  }

  @override
  void turnOff() {
    print('Refrigerator is now off.');
  }
}

void main() {
  Appliance washer = WashingMachine();
  Appliance fridge = Refrigerator();

  washer.turnOn(); // Washing machine is now on.
  fridge.turnOn(); // Refrigerator is now on.

  washer.turnOff(); // Washing machine is now off.
  fridge.turnOff(); // Refrigerator is now off.
}

↓次回内容:

4-1.Dartのコレクション: リスト、セット、マップの使用

1. コレクションとは
コレクションは、複数の値を管理・操作するためのデータ構造です。Dartには、リスト、セット、マップといった主要なコレクションが用意されています。これらを使用することで、データの管理や操作が容易になります。
2. リスト
リストは、順序付きのコレクションであり、同じデータ型の要素を保持します。リストは、インデックスを使用して要素にアクセスできます。Dartでは、リストはListクラスを使用して表されます。

コメントを残す