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
コメントを残す