Menu
CoddyTech

Method abstrak

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 44 dari 110.

Abstract method adalah method yang dideklarasikan di dalam abstract class tanpa isi. Method ini menentukan signature method, tetapi menyerahkan implementasinya kepada setiap subclass. Setiap class yang memperluas abstract class wajib meng-override semua abstract method, atau class tersebut juga akan menjadi abstract.

abstract class Animal {
  // method abstrak: tidak memiliki isi, harus diimplementasikan oleh subclass
  String makeSound();

  // method konkret: memiliki isi yang digunakan bersama oleh semua subclass
  void breathe() {
    print('Breathing...');
  }
}

class Dog extends Animal {
  @override
  String makeSound() {
    return 'Woof!';  // Harus menyediakan implementasi
  }
}

class Cat extends Animal {
  @override
  String makeSound() {
    return 'Meow!';  // Implementasi berbeda, signature sama
  }
}

Jika subclass lupa mengimplementasikan method abstract, Dart akan memberi kamu error compile. Inilah inti dari semuanya, method abstract menegakkan sebuah kontrak. Setiap subclass dijamin memiliki method tersebut, jadi kamu bisa memanggilnya dengan aman pada instance apa pun dari tipe abstract.

// Kamu bisa menggunakan tipe abstrak sebagai tipe variabel
Animal a = Dog();
print(a.makeSound());  // Guk!

Animal b = Cat();
print(b.makeSound());  // Meong!

Method abstrak berbeda dari method konkret dalam abstract class. Method konkret memiliki isi dan diwarisi apa adanya. Method abstrak tidak memiliki isi dan harus di-override.

Kamu dapat mencampur keduanya dalam abstract class yang sama untuk berbagi perilaku tertentu, sekaligus mewajibkan subclass mendefinisikan perilaku lainnya sendiri.

FiturMethod AbstrakMethod Konkret
Memiliki isiTidakYa
Harus ditimpaYaTidak
TujuanMenegakkan kontrakBerbagi perilaku
LokasiHanya pada class abstrakClass apa pun
challenge icon

Tantangan

Mudah

Mari buat kalkulator bentuk yang menunjukkan cara kerja method abstrak. Kamu akan mendefinisikan class abstrak dengan method abstrak yang harus diimplementasikan secara berbeda oleh setiap bentuk, lalu menggunakan bentuk-bentuk tersebut melalui antarmuka umum.

Kamu akan mengatur kodemu ke dalam empat file:

  • shape.dart: Definisikan class abstrak Shape dengan field final color (String) dan constructor yang menginisialisasinya. Deklarasikan dua method abstrak: double area() dan double perimeter(). Tambahkan juga method konkret describe() yang mencetak A [color] shape with area: [area] and perimeter: [perimeter]. Karena area() dan perimeter() bersifat abstrak, setiap subclass akan menyediakan perhitungannya sendiri, tetapi describe() dapat digunakan oleh semuanya tanpa perlu dioverride.
  • circle.dart: Buat class Circle yang memperluas Shape. Class ini memiliki field final radius (double). Constructornya menerima color dan radius, lalu meneruskan color ke super. Implementasikan area() agar mengembalikan 3.14 * radius * radius dan perimeter() agar mengembalikan 2 * 3.14 * radius.
  • rectangle.dart: Buat class Rectangle yang memperluas Shape. Class ini memiliki field final width dan height (keduanya double). Constructornya menerima color, width, dan height, lalu meneruskan color ke super. Implementasikan area() agar mengembalikan width * height dan perimeter() agar mengembalikan 2 * (width + height).
  • main.dart: Impor semua file. Buat Circle dengan warna 'red' dan radius 5.0, serta Rectangle dengan warna 'blue', lebar 4.0, dan tinggi 6.0. Panggil describe() pada setiap bentuk. Lalu buat List<Shape> yang berisi kedua bentuk, lakukan perulangan pada list tersebut, dan cetak Area: [area] untuk setiap bentuk.

Output yang diharapkan:

A red shape with area: 78.5 and perimeter: 31.400000000000002
A blue shape with area: 24.0 and perimeter: 20.0
Area: 78.5
Area: 24.0

Coba sendiri

import 'shape.dart';
import 'circle.dart';
import 'rectangle.dart';

void main() {
  // TODO: Buat Circle dengan warna 'red' dan radius 5.0

  // TODO: Buat Rectangle dengan warna 'blue', lebar 4.0, dan tinggi 6.0

  // TODO: Panggil describe() pada lingkaran

  // TODO: Panggil describe() pada persegi panjang

  // TODO: Buat List<Shape> yang berisi kedua bentuk

  // TODO: Lakukan perulangan pada list dan cetak "Area: [area]" untuk setiap bentuk
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online