戻り値 operator 演算子 (dynamic 変数 ) {演算子のオーバーライドもメソッドと同じような形で記述をします。ただし、一般のメソッドと異なるのは、戻り値の指定の後に「operator」というキーワードが用意されることです。これにより、このメソッドが演算子の処理を定義するものだとわかります。
……略……
}
bool operator ==(dynamic other) {==のような比較演算子は、結果をboolで返しますので戻り値はboolです。ここでは、引数で渡されるdynamic変数がMyDataインスタンスかどうかチェックし、そうだった場合は、name, mail, ageのそれぞれの値が同じかチェックして結果を返しています。「何をチェックすれば、2つのインスタンスを等しいと判断していいいか」を考えれば、処理の内容はわかるでしょう。
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){+などの四則演算の演算子は、2つのMyDataを演算した結果のMyDataを返すような形になっているのが自然でしょう。そこで戻り値はMyDataにしてあります。これも、やはり最初に引数のオブジェクトがMyDataかどうかチェックし、そうだった場合は、name, mail, ageのそれぞれの値を足したMyDataインスタンスを作って返しています。MyDataではなかった場合は、ここではnullを返すようにしておきました。
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;
}
}
※リストが表示されない場合
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!'); } } }
<< 前へ |