Dart-programming-classes

提供:Dev Guides
移動先:案内検索

Dartプログラミング-クラス

Dartはオブジェクト指向言語です。 クラス、インターフェースなどのオブジェクト指向プログラミング機能をサポートしています。 OOPに関する class は、オブジェクトを作成するための青写真です。 class はオブジェクトのデータをカプセル化します。 Dartは、 class と呼ばれるこの概念の組み込みサポートを提供します。

クラスを宣言する

*class* キーワードを使用して、Dartで *class* を宣言します。 クラス定義は、キーワードclassで始まり、その後に *class name* が続きます。クラス本体は、中括弧のペアで囲まれています。 同じための構文は以下のとおりです-

構文

class class_name {
   <fields>
   <getters/setters>
   <constructors>
   <functions>
}
*class* キーワードの後に​​クラス名が続きます。 クラスに名前を付けるときは、識別子の規則を考慮する必要があります。

クラス定義には、次のものを含めることができます-

  • フィールド-フィールドは、クラスで宣言された変数です。 フィールドは、オブジェクトに関連するデータを表します。
  • セッターとゲッター-プログラムがクラスのフィールドの値を初期化および取得できるようにします。 デフォルトのゲッター/セッターはすべてのクラスに関連付けられています。 ただし、セッター/ゲッターを明示的に定義することにより、デフォルトのものをオーバーライドできます。
  • コンストラクタ-クラスのオブジェクトにメモリを割り当てる役割を担います。
  • 関数-関数はオブジェクトが実行できるアクションを表します。 また、メソッドと呼ばれることもあります。

これらのコンポーネントをまとめて、クラスの*データメンバー*と呼びます。

例:クラスの宣言

class Car {
  //field
   String engine = "E1001";

  //function
   void disp() {
      print(engine);
   }
}

この例では、クラス Car を宣言しています。 クラスには engine という名前のフィールドがあります。 * disp()は、フィールド *engine の値を出力する単純な関数です。

クラスのインスタンスの作成

クラスのインスタンスを作成するには、 new キーワードにクラス名を続けて使用します。 同じための構文は以下のとおりです-

構文

var object_name = new class_name([ arguments ])
  • new キーワードはインスタンス化を担当します。
  • 式の右側は、コンストラクターを呼び出します。 パラメーター化されている場合、コンストラクターに値を渡す必要があります。

例:クラスのインスタンス化

var obj = new Car("Engine 1")

属性と機能へのアクセス

クラスの属性と機能は、オブジェクトを介してアクセスできます。 クラスのデータメンバーにアクセスするには、「。」ドット表記(*ピリオドと呼ばれる)を使用します。

//accessing an attribute
obj.field_name

//accessing a function
obj.function_name()

Dartの属性と機能にアクセスする方法を理解するために、次の例を見てください-

void main() {
   Car c= new Car();
   c.disp();
}
class Car {
  //field
   String engine = "E1001";

  //function
   void disp() {
      print(engine);
   }
}

上記のコードの*出力*は次のとおりです-

E1001

Dartコンストラクター

コンストラクターは、クラスの変数の初期化を担当するクラスの特別な関数です。 Dartは、クラスの名前と同じ名前のコンストラクターを定義します。 コンストラクターは関数であるため、パラメーター化できます。 ただし、関数とは異なり、コンストラクターは戻り値の型を持つことはできません。 コンストラクターを宣言しない場合、デフォルトの*引数なしコンストラクター*が提供されます。

構文

Class_name(parameter_list) {
  //constructor body
}

次の例は、Dartでコンストラクタを使用する方法を示しています-

void main() {
   Car c = new Car('E1001');
}
class Car {
   Car(String engine) {
      print(engine);
   }
}

次の output が生成されるはずです-

E1001

名前付きコンストラクター

Dartは named constructors を提供して、クラスが*複数のコンストラクター*を定義できるようにします。 名前付きコンストラクタの構文は以下のとおりです-

構文:コンストラクターの定義

Class_name.constructor_name(param_list)

次の例は、Dartで名前付きコンストラクタを使用する方法を示しています-

void main() {
   Car c1 = new Car.namedConst('E1001');
   Car c2 = new Car();
}
class Car {
   Car() {
      print("Non-parameterized constructor invoked");
   }
   Car.namedConst(String engine) {
      print("The engine is : ${engine}");
   }
}

次の output が生成されるはずです-

The engine is : E1001
Non-parameterized constructor invoked

thisキーワード

*this* キーワードは、クラスの現在のインスタンスを参照します。 ここで、パラメーター名とクラスのフィールドの名前は同じです。 したがって、あいまいさを避けるために、クラスのフィールドの先頭には *this* キーワードが付きます。 次の例は同じを説明します-

次の例では、Dartで this キーワードを使用する方法を説明します-

void main() {
   Car c1 = new Car('E1001');
}
class Car {
   String engine;
   Car(String engine) {
      this.engine = engine;
      print("The engine is : ${engine}");
   }
}

次の output が生成されるはずです-

The engine is : E1001

Dart Class─ゲッターとセッター

*accessor* および *mutators* とも呼ばれる *Getters* および *Setters* を使用すると、プログラムはそれぞれクラスフィールドの値を初期化および取得できます。 ゲッターまたはアクセサーは、 *get* キーワードを使用して定義されます。 セッターまたはミューテーターは、 *set* キーワードを使用して定義されます。

デフォルトのゲッター/セッターは、すべてのクラスに関連付けられています。 ただし、セッター/ゲッターを明示的に定義することにより、デフォルトのものをオーバーライドできます。 ゲッターにはパラメーターがなく、値を返します。セッターにはパラメーターが1つあり、値を返しません。

構文:ゲッターの定義

Return_type  get identifier
{
}

構文:セッターの定義

set identifier
{
}

次の例は、Dartクラスで getters および setters を使用する方法を示しています-

class Student {
   String name;
   int age;

   String get stud_name {
      return name;
   }

   void set stud_name(String name) {
      this.name = name;
   }

   void set stud_age(int age) {
      if(age<= 0) {
        print("Age should be greater than 5");
      }  else {
         this.age = age;
      }
   }

   int get stud_age {
      return age;
   }
}
void main() {
   Student s1 = new Student();
   s1.stud_name = 'MARK';
   s1.stud_age = 0;
   print(s1.stud_name);
   print(s1.stud_age);
}

このプログラムコードは、次の*出力*を生成する必要があります-

Age should be greater than 5
MARK
Null

クラスの継承

Dartは、既存のクラスから新しいクラスを作成するプログラムの機能である継承の概念をサポートしています。 新しいクラスを作成するために拡張されたクラスは、親クラス/スーパークラスと呼ばれます。 新しく作成されたクラスは、子/サブクラスと呼ばれます。

クラスは、「extends」キーワードを使用して別のクラスから継承します。 子クラスは、親クラスのコンストラクタを除くすべてのプロパティとメソッドを継承します

構文

class child_class_name extends parent_class_name

-Dartは多重継承をサポートしていません。

例:クラスの継承

次の例では、クラス Shape を宣言しています。 このクラスは、 Circle クラスによって拡張されます。 クラス間に継承関係があるため、子クラス、つまりクラス Car は親クラスのデータメンバーへの暗黙的なアクセスを取得します。

void main() {
   var obj = new Circle();
   obj.cal_area();
}
class Shape {
   void cal_area() {
      print("calling calc area defined in the Shape class");
   }
}
class Circle extends Shape {}

次の output が生成されるはずです-

calling calc area defined in the Shape class

継承の種類

継承は、次の3つのタイプにすることができます-

  • Single -すべてのクラスは、1つの親クラスから最大で拡張できます。
  • Multiple -クラスは複数のクラスから継承できます。 Dartは多重継承をサポートしていません。
  • マルチレベル-クラスは別の子クラスから継承できます。

次の例は、マルチレベルの継承の仕組みを示しています-

void main() {
   var obj = new Leaf();
   obj.str = "hello";
   print(obj.str);
}
class Root {
   String str;
}
class Child extends Root {}
class Leaf extends Child {}
//indirectly inherits from Root by virtue of inheritance

クラス Leaf は、マルチレベルの継承により、RootクラスとChildクラスから属性を取得します。 その*出力*は次のとおりです-

hello

Dart –クラスの継承とメソッドのオーバーライド

メソッドのオーバーライドは、子クラスが親クラスのメソッドを再定義するメカニズムです。 次の例は同じことを示しています-

void main() {
   Child c = new Child();
   c.m1(12);
}
class Parent {
   void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
   @override
   void m1(int b) {
      print("value of b ${b}");
   }
}

次の output が生成されるはずです-

value of b 12

メソッドをオーバーライドしている間、関数パラメーターの数とタイプは一致する必要があります。 パラメーターの数またはそれらのデータ型が一致しない場合、Dartコンパイラーはエラーをスローします。 次の図は同じことを説明しています-

import 'dart:io';
void main() {
   Child c = new Child();
   c.m1(12);
}
class Parent {
   void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
   @override
   void m1(String b) {
      print("value of b ${b}");
   }
}

次の output が生成されるはずです-

value of b 12

静的キーワード

*static* キーワードは、クラスのデータメンバー、つまり *fields* および *methods* に適用できます。 静的変数は、プログラムが実行を終了するまでその値を保持します。 静的メンバーはクラス名によって参照されます。

class StaticMem {
   static int num;
   static disp() {
      print("The value of num is ${StaticMem.num}")  ;
   }
}
void main() {
   StaticMem.num = 12;
  //initialize the static variable }
   StaticMem.disp();
  //invoke the static method
}

次の output が生成されるはずです-

The value of num is 12

スーパーキーワード

*super* キーワードは、クラスの直接の親を参照するために使用されます。 キーワードを使用して、*変数、プロパティ、*または*メソッド*のスーパークラスバージョンを参照できます。 次の例は同じことを示しています-

void main() {
   Child c = new Child();
   c.m1(12);
}
class Parent {
   String msg = "message variable from the parent class";
   void m1(int a){ print("value of a ${a}");}
}
class Child extends Parent {
   @override
   void m1(int b) {
      print("value of b ${b}");
      super.m1(13);
      print("${super.msg}")   ;
   }
}

次の output が生成されるはずです-

value of b 12
value of a 13
message variable from the parent class