3-5.Dartのコンストラクタ

1. コンストラクタとは

コンストラクタは、クラスのインスタンス(オブジェクト)を作成するときに呼び出される特別なメソッドです。コンストラクタを使用することで、オブジェクトのプロパティを初期化したり、初期設定を行ったりすることができます。Dartでは、コンストラクタはクラスと同じ名前を持ちます。

2. デフォルトコンストラクタ

クラスにコンストラクタを定義しない場合、Dartは自動的に引数のないデフォルトコンストラクタを提供します。

Dart
class Person {
  String name;
  int age;

  // デフォルトコンストラクタ(自動的に提供される)
  Person();

  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }
}

void main() {
  Person person = Person();
  person.name = 'Alice';
  person.age = 30;
  person.greet(); // Hello, my name is Alice and I am 30 years old.
}

3. パラメータ付きコンストラクタ

パラメータ付きコンストラクタを使用することで、オブジェクトのプロパティを初期化することができます。

Dart
class Person {
  String name;
  int age;

  // パラメータ付きコンストラクタ
  Person(this.name, this.age);

  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }
}

void main() {
  Person person = Person('Bob', 25);
  person.greet(); // Hello, my name is Bob and I am 25 years old.
}

4. 名前付きコンストラクタ

Dartでは、クラスに複数のコンストラクタを持たせるために、名前付きコンストラクタを使用することができます。名前付きコンストラクタは、クラス名の後にドット(.)を付けて名前を付けます。

Dart
class Point {
  double x;
  double y;

  // パラメータ付きコンストラクタ
  Point(this.x, this.y);

  // 名前付きコンストラクタ
  Point.origin() {
    x = 0;
    y = 0;
  }

  void display() {
    print('Point: ($x, $y)');
  }
}

void main() {
  Point p1 = Point(3.0, 4.0);
  p1.display(); // Point: (3.0, 4.0)

  Point p2 = Point.origin();
  p2.display(); // Point: (0.0, 0.0)
}

5. 初期化リスト

初期化リストを使用することで、コンストラクタの本体が実行される前にフィールドを初期化できます。これは、コンストラクタのコロン(:)の後にフィールドの初期化を行う形式です。

Dart
class Rectangle {
  double width;
  double height;
  double area;

  // 初期化リストを使用したコンストラクタ
  Rectangle(this.width, this.height) : area = width * height;

  void display() {
    print('Width: $width, Height: $height, Area: $area');
  }
}

void main() {
  Rectangle rect = Rectangle(5.0, 3.0);
  rect.display(); // Width: 5.0, Height: 3.0, Area: 15.0
}

6. コンストラクタのオーバーロード

Dartでは、コンストラクタのオーバーロードはサポートされていませんが、名前付きコンストラクタを使用することで同様の効果を得ることができます。

Dart
class Employee {
  String name;
  int age;
  String position;

  // パラメータ付きコンストラクタ
  Employee(this.name, this.age, this.position);

  // 名前付きコンストラクタ
  Employee.manager(String name, int age) {
    this.name = name;
    this.age = age;
    this.position = 'Manager';
  }

  void display() {
    print('Name: $name, Age: $age, Position: $position');
  }
}

void main() {
  Employee emp1 = Employee('Alice', 30, 'Developer');
  emp1.display(); // Name: Alice, Age: 30, Position: Developer

  Employee emp2 = Employee.manager('Bob', 40);
  emp2.display(); // Name: Bob, Age: 40, Position: Manager
}

7. 例題

例題1: 基本的なパラメータ付きコンストラクタ

Dart
class Car {
  String brand;
  String model;
  int year;

  Car(this.brand, this.model, this.year);

  void displayInfo() {
    print('Brand: $brand, Model: $model, Year: $year');
  }
}

void main() {
  Car car = Car('Toyota', 'Corolla', 2021);
  car.displayInfo(); // Brand: Toyota, Model: Corolla, Year: 2021
}

例題2: 名前付きコンストラクタと初期化リスト

Dart
class Circle {
  double radius;
  double area;

  // 名前付きコンストラクタ
  Circle(this.radius) : area = 3.14 * radius * radius;

  // 名前付きコンストラクタ
  Circle.unitCircle() : radius = 1, area = 3.14;

  void displayInfo() {
    print('Radius: $radius, Area: $area');
  }
}

void main() {
  Circle circle1 = Circle(5.0);
  circle1.displayInfo(); // Radius: 5.0, Area: 78.5

  Circle circle2 = Circle.unitCircle();
  circle2.displayInfo(); // Radius: 1.0, Area: 3.14
}

例題3: 名前付きコンストラクタを使用した複数の初期化方法

Dart
class Book {
  String title;
  String author;
  int year;
  double price;

  // パラメータ付きコンストラクタ
  Book(this.title, this.author, this.year, this.price);

  // 名前付きコンストラクタ
  Book.discounted(String title, String author, int year) : this(title, author, year, 9.99);

  void displayInfo() {
    print('Title: $title, Author: $author, Year: $year, Price: $price');
  }
}

void main() {
  Book book1 = Book('1984', 'George Orwell', 1949, 15.99);
  book1.displayInfo(); // Title: 1984, Author: George Orwell, Year: 1949, Price: 15.99

  Book book2 = Book.discounted('Animal Farm', 'George Orwell', 1945);
  book2.displayInfo(); // Title: Animal Farm, Author: George Orwell, Year: 1945, Price: 9.99
}

↓次回内容:

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

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

コメントを残す