Dartクラス

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

クラスを宣言する

キーワードclassを使用して、Dartでクラスを宣言します。クラス定義は、キーワードclassで始まり、その後にクラス名が続きます。クラス本体は、中括弧のペアで囲まれています。次には宣言構文を示します。

構文

class class_name {  
   <fields> 
   <getters/setters> 
   <constructors> 
   <functions> 
}

classキーワードの後にクラス名が続きます。 クラスに名前を付けるときは、識別子の規則を考える必要があります。クラス定義には、次のものを含めることができます。

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

これらのコンポーネントを合わせて、クラスのデータメンバーと呼ばれます。

実例:クラスを宣言する

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

   // 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 = "EA888";  

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

上記のコードを実行した後、出力結果は以下のとおりです。

EA888

Dartコンストラクタ

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

構文

class_name(parameter_list) { 
   //constructor body 
}

実例

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

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

上記のコードを実行した後、出力結果は以下のとおりです。

EA888

名前付きコンストラクタ

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

構文:コンストラクタを定義する

class_name.constructor_name(param_list)

実例

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

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

上記のコードを実行した後、出力結果は以下のとおりです。

The engine is : EA888 
Non-parameterized constructor invoked

thisキーワード

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

実例

次の実例では、Dartでthisキーワードを使用する方法を示しています。

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

上記のコードを実行した後、出力結果は以下のとおりです。

The engine is : EA888

DartクラスのGettersとSetter

GettersとSetter(アクセサとチェンジャとも呼ばれます)を使用すると、プログラムはそれぞれクラスフィールドの値を初期化および検索できます。getキーワードを使用して、getterまたはアクセサを定義します。Setterまたはアクセサは、setキーワードによって定義されます。

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

構文:getterを定義する

return_type  get identifier 
{ 
}

構文:setterを定義する

set identifier 
{ 
}

実例

次の実例では、Dartクラスでgetterとsetterを使用する方法を示しています。

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<= 15) { 
        print("Age should be greater than 15"); 
      }  else { 
         this.age = age; 
      } 
   } 

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

プログラムコードは以下の結果を出力します。

Age should be greater than 15 
Ceodata
Null

クラス継承

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

1つのクラスは、extendsキーワードを使用して別のクラスから継承します。サブクラスは、親クラスのコンストラクタ以外、すべての属性とメソッドを継承します。

構文

class child_class_name extends parent_class_name

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

実例:クラスの継承

以下の実例では、Circleクラスから拡張されたクラスShapeが宣言されています。クラス間の継承関係により、サブクラス(Circleクラス)は、その親クラスのデータメンバーへの暗黙的なアクセスを取得します。

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 {}

上記のコードを実行した後、出力結果は以下のとおりです。

calling calc area defined in the Shape class

継承の型

継承には次の3種類の型があります。

  • 単一層 – 各クラスは、最大で1つの親クラスから拡張できます。
  • マルチレイヤー – クラスは複数のクラスから継承できますが、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}"); 
   } 
}

上記のコードを実行した後、出力結果は以下のとおりです。

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}");
   } 
}

上記のコードを実行した後、出力結果は以下のとおりです。

value of b 12

staticキーワード

staticキーワードは、クラスのデータメンバー、つまりフィールドとメソッドに適用できます。静的変数は、プログラムが実行を終了するまでその値を保持します。静的メンバーはクラス名で参照されます。

実例

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 
}

上記のコードを実行した後、出力結果は以下のとおりです。

The value of num is 12

superキーワード

superキーワードは、クラスの直接の親クラスを参照するために使用されます。supperキーワードは、supperクラスの変数、属性、またはメソッドなどを参照するために使用できます。

実例

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}")   ; 
   } 
}

上記のコードを実行した後、出力結果は以下のとおりです。

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です