Operator Overloading
Operator Overloading adalah cara mengubah tujuan/fungsi dari operator bawaan Dart untuk melakukan operasi/fungsi yang kita inginkan yang kita defenisikan pada kelas, misalnya operator + digunakan untuk menjumlahkan dua buah bilangan, akan tetapi operator ini akan di Overload pada saat kita menggunakan operator + ini pada String, yaitu “a” + “b” = “ab”, operator tersebut tidak akan menjumlahkan a+b akan tetapi akan melakukan penggabungan, dari contoh ini kita bisa mengerti arti dari Overloading Operator.
Kelas Point Dari Paket dart:math
Contoh lain dari operator overloading adalah librari kelas Point dari paket dart:math. Library tersebut meng-overload operator +, -, * dan ==. Kelas Point mewakili lokasi dua dimensi dengan titik koordinat x, y. Bagaimana caranya dua Point dijumlahkan? Misalnya: Point a mewakili lokasi x1, y1 dan Point b mewakili lokasi x2, y2, maka penjumlahan kedua Point (a+b) adalah x1+x2, y1+y2, penggunaan operator tetap sama.
Berbeda dengan operator * (perkalian), operator ini tidak bisa digunakan dengan objek Point lainnya tetapi dengan angka secara langsung, artinya kita tidak akan bisa melakukan operasi perkalian atara dua buah objek Point, misalnya: a * b akan mengakibatkan error, namun kita bisa melakukan operasi berikut a = a * 2 menjadi (x1*2, y1*2). Perhatikan contoh kode berikut:
import "dart:math";
void main() {
Point a = new Point(2, 2);
Point b = new Point(4, 4);
// ingat bahwa a dan b merupakan objek dari kelas Point
// dimana b mewakili (4,4) dan a mewakili (2,2)
// sehingga b = b - a adalah b = (4-2, 4-2) menjadi (2,2)
b = b - a;
print(b); // print Point(2, 2)
//a = a * b; menyebakan error
// a = a * 2 adalah (2*2, 2*2) menjad (4,4)
a = a * 2;
print(a); // print Point(4,4)
// a = b + a adalah a = (2+4, 2+4) menjad (6,6)
// b menjadi (2,2) karena proses sebelumnya b = b - a;
a = b + a;
print(a); // print Point(6,6)
if ((b + b) == (a - b)) {
// ini kondisi benar
print("Kedua sisi memiliki nilai yang sama");
}
}
Overloading Operator Pada Kelas Kita Sendiri.
class Population {
String name;
int pop;
Population(this.name, this.pop);
operator &(Population other) =>
new Population(name + " & " + other.name, pop + other.pop);
operator +(int newPeople) => pop += newPeople;
String toString() {
return "$name has a population of $pop";
}
}
void main() {
Population medan = new Population("Medan", 2500);
Population jakarta = new Population("Jakarta", 5000);
Population medan_jakarta = medan & jakarta;
print(medan_jakarta);
jakarta + 1000;
print(jakarta); // print: Jakarta has a population of 6000
}
Contoh Lain
class Kubus {
int sisi;
Kubus(this.sisi);
operator +(int newSisi) => sisi += newSisi;
operator -(int newSisi) {
if (sisi < newSisi) {
print("Sisi tidak boleh minus");
} else {
sisi -= newSisi;
}
}
String toString() {
return "$sisi";
}
}
void main() {
Kubus k1 = new Kubus(10);
print(k1);
k1 + 10; // print 20
print(k1);
k1 - 15; // print 5
print(k1);
k1 - 50; // print("sisi tidak boleh minus")
print(k1); //print 5 nilai terakhir dari sisi
}
bool operator ==(other) {
if (other is !Point) return false;
return x == other.x && y == other.y;
}
Point<T> operator +(Point<T> other) {
return new Point<T>(x + other.x, y + other.y);
}
Point<T> operator -(Point<T> other) {
return new Point<T>(x - other.x, y - other.y);
}
Point<T> operator *(num factor) {
return new Point<T>(x * factor, y * factor);
}
Generics
List fruits1 = ["apel", "pisang", "jeruk"];
List<String> fruits2 = ["apel", "pisang", "jeruk"];
//deklarasi kelas dengan fitur generics
class CetakPesan<T> {
int jumlahCetak;
T pesan;
CetakPesan(this.jumlahCetak, this.pesan);
void cetak() {
for (int i = 0; i < jumlahCetak; i++) {
print(pesan);
}
}
}
void main() {
// cetakPesan dengan tipe integer
CetakPesan<int> cetakPesan = CetakPesan(5, 100);
cetakPesan.cetak();
// cetakPesan2 dengan tipe String
CetakPesan<String> cetakPesan2 = CetakPesan(5, "Hello, World");
cetakPesan2.cetak();
}
Exception
Bekerja dengan Exception built-in pada Dart
import 'dart:io';
void main() {
String intTemp = stdin.readLineSync();
int answer = int.parse(intTemp);
print(answer);
}
import 'dart:io';
void main() {
print("Input Sebuah Nilai: ");
String intTemp = stdin.readLineSync();
int userAnswer;
try {
userAnswer = int.parse(intTemp);
print(userAnswer);
} on FormatException {
print("Terjadi Kesalahan");
}
print("ini masih dijalankan");
print("program tidak crash karena exception ditangani");
}
import 'dart:io';
void main() {
print("Input Sebuah Nilai: ");
String intTemp = stdin.readLineSync();
int userAnswer;
try {
userAnswer = int.parse(intTemp);
print(userAnswer);
} catch (exception) {
print("Terjadi Kesalahan");
//kita bisa mencetak pesan dari exception yang terjadi
print(exception);
}
print("ini masih dijalankan");
print("program tidak crash karena exception ditangani");
}
import 'dart:io';
void main() {
print("Input Sebuah Nilai: ");
String intTemp = stdin.readLineSync();
int userAnswer;
try {
userAnswer = int.parse(intTemp);
print(userAnswer);
} catch (exception, stacktrace) {
print("Terjadi Kesalahan");
//kita bisa mencetak pesan dari exception yang terjadi
print(exception);
print(stacktrace);
}
print("ini masih dijalankan");
print("program tidak crash karena exception ditangani");
}
import 'dart:io';
void main() {
print("Input Sebuah Nilai: ");
String intTemp = stdin.readLineSync();
int userAnswer;
try {
userAnswer = int.parse(intTemp);
print(userAnswer);
} catch (exception, stacktrace) {
print("Terjadi Kesalahan");
//kita bisa mencetak pesan dari exception yang terjadi
print(exception);
print(stacktrace);
} finally {
print(“block finally akan tetap dijalankan”);
print(“walaupun exception terjadi atau tidak”);
}
print("ini masih dijalankan");
print("program tidak crash karena exception ditangani");
}
Membuat Kelas Exception Sendiri
class BagiNolException implements Exception {
String pesan;
BagiNolException(this.pesan);
String toString() {
return pesan;
}
}
class Aritmatika {
double bagi(x, y) =>
y != 0 ? x / y : throw BagiNolException("Pembagian Dengan Nol");
}
void main() {
Aritmatika aritmatika = Aritmatika();
// ingat bahwa exception harus ditanggkap dengan block try-on / try-catch
try {
print(aritmatika.bagi(2, 5));
print(aritmatika.bagi(2, 0));
} catch (e) {
print(e);
}
print("baris ini masih dieksekusi");
// jadikan kode blok try sampai print menjadi komentar
// hapus tanda komentar pada kode print dibawah, dan bandingkan hasilnya.
//print(aritmatika.bagi(2, 5));
//print(aritmatika.bagi(2, 0));
//print("baris ini masih dieksekusi");
}

No comments: