クラスを更に掘り下げる! (5/6)
作成:2018-04-21 09:27
更新:2018-04-21 09:27
更新:2018-04-21 09:27
■継承・インターフェイス・ミックスインのチェック
継承やインターフェイス、ミックスインと、Dartには、別のクラスの機能を利用するための仕組みがいろいろと用意されています。これらは、特定の機能があることを前提に処理を構築できるという特徴があります。が、そのためには、特定のクラスが継承やインプリメント、ミックスインされていてそのクラスに定義されているメソッドなどが必ず用意されていることを確認しないといけません。
こうした確認には「is」演算子が便利です。isは、あるクラスやインスタンスが、指定したクラスとしての機能を備えているかどうかをチェックするものです。例えば、「A is B」とすれば、クラスAの中に、クラスBの機能が全て揃っている(つまり、AはBとして扱うことができる)ということを示しています。
継承、インターフェイス、ミックスインといった機能を使って別のクラスを組み込んだ場合、このisによるチェック結果はすべて「true」になります。例えば、「A is B」の結果がtrueならば、AクラスのインスタンスにはBクラスのメソッドが全て揃っていると判断できるわけです。
では、利用例を挙げておきましょう。下のリストでは、MyDataクラスにさまざまなクラスが組み込まれています。他のクラスとの関係を整理すると以下のようになります。
MyObj ――継承している
Printing ――ミックスインしている
Plus ――インプリメントしている
Other ――無関係
これらのクラスについて、isで関係を調べると、MyObj、Printing、Plusについてはtrue、Otherについてはfalseとなることがわかります。
こうした確認には「is」演算子が便利です。isは、あるクラスやインスタンスが、指定したクラスとしての機能を備えているかどうかをチェックするものです。例えば、「A is B」とすれば、クラスAの中に、クラスBの機能が全て揃っている(つまり、AはBとして扱うことができる)ということを示しています。
継承、インターフェイス、ミックスインといった機能を使って別のクラスを組み込んだ場合、このisによるチェック結果はすべて「true」になります。例えば、「A is B」の結果がtrueならば、AクラスのインスタンスにはBクラスのメソッドが全て揃っていると判断できるわけです。
では、利用例を挙げておきましょう。下のリストでは、MyDataクラスにさまざまなクラスが組み込まれています。他のクラスとの関係を整理すると以下のようになります。
MyObj ――継承している
Printing ――ミックスインしている
Plus ――インプリメントしている
Other ――無関係
これらのクラスについて、isで関係を調べると、MyObj、Printing、Plusについてはtrue、Otherについてはfalseとなることがわかります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
void main() { MyData hanako = new MyData.make('Hanako', 'hanako@flower', 28); hanako.printData(); hanako.printIt(hanako.getData()); print(hanako is MyData); print(hanako is MyObj); print(hanako is Printing); print(hanako is Plus); print(hanako is Other); } class MyObj { String name; String mail; num age; Map getData(){ return {'name':this.name, 'mail':this.mail, 'age':this.age}; } } class Printing { void printIt(Map data){ for (var ky in data.keys){ print(ky + ":" + data[ky].toString()); } } } class Plus {} class Other {} class MyData extends MyObj with Printing implements Plus { MyData() : this.make('noname', 'no@mail', 0); MyData.make(String name, String mail, num age){ this.name = name; this.mail = mail; this.age = age; } void printData(){ String re = '<MyObj "' + this.name + ' [' + this.mail + '"](' + this.age.toString() + ')>'; print(re); } }
※関連コンテンツ