Method (Metode)

Metode adalah fungsi yang memberikan perilaku pada objek, terbagi menjadi empat kategori: metode instans, overload operator, Getter/Setter, dan metode abstrak.

1. Instance methods Metode Instans

  1. Merupakan metode milik objek instans dari suatu kelas;
  2. Dapat mengakses variabel instans secara langsung dan menggunakan kata kunci this;
  3. Memiliki isi fungsi lengkap untuk menjalankan perhitungan bisnis dan operasi logika.
import 'dart:math';

class Point {
  final double x;
  final double y;

  // Konstruktor untuk inisialisasi variabel instans
  Point(this.x, this.y);

  // Metode instans: hitung jarak dua titik
  double distanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return sqrt(dx * dx + dy * dy);
  }
}

void main() {
  Point p1 = Point(0, 0);
  Point p2 = Point(3, 4);
  print(p1.distanceTo(p2)); // Cetak 5.0
}Code language: JavaScript (javascript)

2. Operators Overload Operator

  1. Sebagian besar operator pada dasarnya adalah metode instans dengan nama khusus;
  2. Sintaks deklarasi: operator Operator(parameter) TipeKembali { ... };
  3. Daftar operator yang bisa di-overload:
    < > <= >= == ~
    - + / ~/ * %
    | ˆ & << >>> >>
    []= []
  4. Operator bawaan tidak dapat di-overload (contoh: !=, diimplementasikan otomatis Dart di lapisan bawah, tidak perlu definisi manual);
  5. Saat melakukan overload ==, wajib menimpa hashCode juga, jika tidak pengecekan kesamaan akan bermasalah.
class Vector {
  final int x, y;

  Vector(this.x, this.y);

  // Overload + untuk penjumlahan vektor
  Vector operator +(Vector v) => Vector(x + v.x, y + v.y);
  // Overload - untuk pengurangan vektor
  Vector operator -(Vector v) => Vector(x - v.x, y - v.y);

  // Overload == untuk pengecekan kesamaan
  @override
  bool operator ==(Object other) =>
      other is Vector && x == other.x && y == other.y;

  // Timpaan hashCode yang sepasang
  @override
  int get hashCode => Object.hash(x, y);
}

void main() {
  final v = Vector(2, 3);
  final w = Vector(2, 2);

  assert(v + w == Vector(4, 5));
  assert(v - w == Vector(0, 1));
  print(v + w);
}Code language: JavaScript (javascript)

Dengan overload operator, kita bisa melakukan operasi +, -, == dan operasi angka lainnya pada dua objek Vector layaknya bilangan biasa.

3. Getters and setters Aksesor

  1. get: metode hanya baca, untuk mengambil properti hasil hitung, tanpa parameter;
  2. set: metode tulis, untuk mengubah variabel terkait, hanya memiliki satu parameter;
  3. Semua variabel instans memiliki getter implisit, variabel yang bisa diubah memiliki setter implisit tambahan;
  4. Kelebihan: nanti variabel biasa bisa diubah menjadi logika perhitungan tanpa mengubah kode pemanggil luar;
  5. Operator penambah/pengurang ++/-- hanya memanggil getter satu kali dan menyimpan nilai untuk menghindari efek samping.
/// Persegi panjang sistem koordinat layar, titik asal (0,0) ada di sudut kiri atas
class Rectangle {
  double left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  // Getter: hitung batas kanan
  double get right => left + width;

  // Setter: tetapkan batas kanan dan perbarui left secara terbalik
  set right(double value) => left = value - width;

  // Getter: hitung batas bawah
  double get bottom => top + height;

  // Setter: tetapkan batas bawah dan perbarui top secara terbalik
  set bottom(double value) => top = value - height;
}

void main() {
  var rect = Rectangle(3, 4, 20, 15);
  assert(rect.left == 3);

  // Panggil setter
  rect.right = 12;
  assert(rect.left == -8);
  print(rect.left); // -8
}Code language: JavaScript (javascript)

4. Abstract methods Metode Abstrak

  1. Hanya mendefinisikan antarmuka tanpa isi fungsi, tanda titik koma ; menggantikan implementasi;
  2. Hanya bisa ditulis di dalam abstract class kelas abstrak atau mixin;
  3. Kelas turunan wajib menimpa dan mengimplementasikan semua metode abstrak, jika tidak kelas turunan juga harus ditandai sebagai abstract.
// Kelas abstrak yang berisi metode abstrak
abstract class Doer {
  // Metode abstrak: hanya deklarasi, tanpa implementasi
  void doSomething();
}

// Kelas turunan biasa, wajib implementasi semua metode abstrak induk
class EffectiveDoer extends Doer {
  @override
  void doSomething() {
    print("Jalankan logika bisnis spesifik");
  }
}

void main() {
  Doer worker = EffectiveDoer();
  worker.doSomething(); // Cetak: Jalankan logika bisnis spesifik
}Code language: JavaScript (javascript)

Perbandingan

Tipe MetodeCiri UtamaPenanda SintaksSkenario Penggunaan
Metode Instans InstanceAkses variabel instans, isi logika lengkapDeklarasi fungsi biasaPerilaku umum objek (perhitungan, operasi bisnis)
Overload Operator OperatorMetode instans nama khusus, gunakan kata kunci operatoroperator +() dllPenjumlahan, pengurangan, indeks dan pengecekan kesamaan objek buatan sendiri
Getter/SetterBaca/tulis properti; get tanpa parameter, set satu parameterget / setEnkapsulasi properti hasil hitung, satu pintu akses baca tulis luar
Metode Abstrak AbstractTanpa isi metode, hanya deklarasi antarmukaTitik koma ; setelah signature metodeTentukan spesifikasi di kelas induk abstrak, paksa implementasi di kelas turunan

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *