戻り値 operator 演算子 (dynamic 変数 ) {
……略……
}演算子のオーバーライドもメソッドと同じような形で記述をします。ただし、一般のメソッドと異なるのは、戻り値の指定の後に「operator」というキーワードが用意されることです。これにより、このメソッドが演算子の処理を定義するものだとわかります。 bool operator ==(dynamic other) {
if (other is MyData){
var f1 = this.name == other.name;
var f2 = this.mail == other.mail;
var f3 = this.age == other.age;
return f1 == f1 && f2 && f3;
} else {
return false;
}
}
==のような比較演算子は、結果をboolで返しますので戻り値はboolです。ここでは、引数で渡されるdynamic変数がMyDataインスタンスかどうかチェックし、そうだった場合は、name, mail, ageのそれぞれの値が同じかチェックして結果を返しています。「何をチェックすれば、2つのインスタンスを等しいと判断していいいか」を考えれば、処理の内容はわかるでしょう。 MyData operator +(dynamic other){
if (other is MyData){
var re = new MyData();
re.name = this.name + ' & ' + other.name;
re.mail = this.mail + ', ' + other.mail;
re.age = this.age + other.age;
return re;
} else {
return null;
}
}+などの四則演算の演算子は、2つのMyDataを演算した結果のMyDataを返すような形になっているのが自然でしょう。そこで戻り値はMyDataにしてあります。これも、やはり最初に引数のオブジェクトがMyDataかどうかチェックし、そうだった場合は、name, mail, ageのそれぞれの値を足したMyDataインスタンスを作って返しています。MyDataではなかった場合は、ここではnullを返すようにしておきました。※リストが表示されない場合
AddBlockなどの広告ブロックツールがONになっているとリストなどが表示されない場合があります。これらのツールをOFFにしてみてください。
void main() {
MyData taro = new MyData.make('Taro', 'taro@yamada', 35);
MyData hanako = new MyData.make('Hanako', 'hanako@flower', 28);
MyData hanako2 = new MyData.make('Hanako', 'hanako@flower', 28);
taro.printData();
hanako.printData();
hanako2.printData();
print(taro == hanako);
print(hanako == hanako2);
var plus_obj = taro + hanako;
plus_obj.printData();
}
class MyObj {
String name;
String mail;
num age;
Map getData(){
return {'name':this.name, 'mail':this.mail, 'age':this.age};
}
}
class MyData extends MyObj {
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);
}
bool operator ==(dynamic other) {
if (other is MyData){
var f1 = this.name == other.name;
var f2 = this.mail == other.mail;
var f3 = this.age == other.age;
return f1 == f1 && f2 && f3;
} else {
return false;
}
}
MyData operator +(dynamic other){
if (other is MyData){
var re = new MyData();
re.name = this.name + ' & ' + other.name;
re.mail = this.mail + ', ' + other.mail;
re.age = this.age + other.age;
return re;
} else {
throw new Exception('cannot add!');
}
}
}
| << 前へ |