1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Dart】名前付きコンストラクタの基本

Posted at

はじめに

ほとんどのオブジェクト指向プログラミング言語には、クラスのインスタンスを生成するための「コンストラクタ」という特別なメソッドがあります。多くの言語では、1つのクラスには複数のコンストラクタを持つことができるものの、それぞれのコンストラクタは異なるシグネチャ(パラメータの型や数)を持つ必要があります。

Dartでは、そのような制限を回避するために「名前付きコンストラクタ」を導入しています。これにより、クラスには複数のコンストラクタを持つことができ、それぞれのコンストラクタにはユニークな名前を付けることができます。

class Point {
  double x, y;

  // 通常のコンストラクタ
  Point(this.x, this.y);

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

void main() {
  var p1 = Point(2, 3);       // 通常のコンストラクタを使用
  var p2 = Point.origin();   // 名前付きコンストラクタを使用

  print('p1: (${p1.x}, ${p1.y})');
  print('p2: (${p2.x}, ${p2.y})');
}

この例では、Pointクラスには2つのコンストラクタがあります。1つは通常のコンストラクタで、もう1つはoriginという名前付きのコンストラクタです。Point.origin()コンストラクタは、座標の原点(0, 0)を表すPointオブジェクトを生成します。

名前付きコンストラクタは、特定の初期状態や設定を持つインスタンスを生成する場合などに非常に便利です。また、名前を持つことで、それぞれのコンストラクタがどのような目的で提供されているのかをコードを読む人に明確に伝えることができます。

名前付きコンストラクタの基本的な書き方

名前付きコンストラクタは、クラス名の後にドット(.)とその後にコンストラクタ名を付けて定義します。

class ClassName {
  ClassName.constructorName();
}

名前付きコンストラクタの例

以下は、Rectangleクラスの例です。このクラスには、通常のコンストラクタと2つの名前付きコンストラクタ(squarefromPoints)が含まれています。

class Rectangle {
  int width;
  int height;
  int left;
  int top;

  // 通常のコンストラクタ
  Rectangle(this.left, this.top, this.width, this.height);

  // 名前付きコンストラクタ: 正方形を生成
  Rectangle.square(int size)
      : width = size,
        height = size,
        left = 0,
        top = 0;

  // 名前付きコンストラクタ: 2つの点からRectangleを生成
  Rectangle.fromPoints(Point a, Point b)
      : left = a.x,
        top = a.y,
        width = b.x - a.x,
        height = b.y - a.y;
}

名前付きコンストラクタの特徴と利点

  1. 明確性: 名前付きコンストラクタは、その名前を通じてコンストラクタの目的や動作を明確に示すことができます。

  2. 柔軟性: 同じシグネチャの異なるコンストラクタを複数持つことができます。これは、他の多くのプログラミング言語では不可能です。

  3. コードの可読性: 名前付きコンストラクタを使用することで、インスタンスの生成時に、そのコンストラクタが何を意味しているのかを直感的に理解することが容易になります。

例:

var square = Rectangle.square(4); // これは正方形であることが明確
var rect = Rectangle.fromPoints(Point(0, 0), Point(2, 4)); // 2つの点から生成されることが明確

まとめ

Dartの名前付きコンストラクタは、クラスのインスタンスを生成する際の柔軟性と明確性を向上させる便利な機能です。クラスに複数の初期化方法や特定のシナリオが必要な場合に特に役立ちます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?