Komposisi vs Pewarisan
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 82 dari 110.
Kamu telah mempelajari bahwa pewarisan menciptakan hubungan "adalah", Dog adalah Animal. Namun, ada pendekatan hebat lainnya: komposisi, yang menciptakan hubungan "memiliki". Alih-alih mewarisi perilaku, sebuah class berisi instance dari class lain dan mendelegasikan pekerjaan kepada instance tersebut.
Pertimbangkan sebuah class Car. Dengan pewarisan, kamu mungkin mencoba memperluas class Engine, tetapi mobil bukanlah mesin, mobil memiliki mesin:
class Engine {
void start() => print('Engine started');
}
class Car {
final Engine _engine = Engine(); // Komposisi: Car MEMILIKI Engine
void start() {
_engine.start(); // Serahkan tugas ke engine
print('Car is ready to drive');
}
}
void main() {
var car = Car();
car.start();
}Keunggulan utama komposisi adalah fleksibilitas. Dengan pewarisan, kamu terikat pada satu class induk. Dengan komposisi, kamu bisa menggabungkan beberapa komponen dan bahkan menggantinya saat program berjalan:
class ElectricEngine {
void start() => print('Electric motor humming');
}
class HybridCar {
Engine? _gasEngine;
ElectricEngine? _electricEngine;
HybridCar({bool useElectric = false}) {
if (useElectric) {
_electricEngine = ElectricEngine();
} else {
_gasEngine = Engine();
}
}
}Panduan umum adalah "utamakan komposisi daripada pewarisan". Gunakan pewarisan jika terdapat hubungan "adalah" yang sebenarnya dan kamu membutuhkan polimorfisme. Gunakan komposisi jika kamu ingin menggunakan kembali perilaku tanpa keterikatan yang erat, atau jika sebuah object membutuhkan kemampuan dari beberapa sumber.
Tantangan
MudahMari bangun sistem komputer menggunakan komposisi! Alih-alih membuat komputer mewarisi bagian-bagiannya, kamu akan membuat class komponen yang terpisah lalu menggabungkannya, karena komputer memiliki CPU dan memiliki memori, bukan merupakan CPU atau memori.
Kamu akan mengatur kodemu dalam tiga file:
components.dart: Buat dua class komponen yang mewakili bagian-bagian komputer:- Class
CPUdenganString branddandouble speedGHz. Sertakan methodprocess()yang mengembalikan string:[brand] processing at [speedGHz]GHz - Class
Memorydenganint sizeGB. Sertakan methodload()yang mengembalikan string:Loading [sizeGB]GB of data
- Class
computer.dart: Buat classComputeryang menggunakan komposisi untuk menggabungkan komponen-komponen tersebut. Komputermu harus:- Memiliki field
String name - Memuat instance
CPUdanMemory(komposisi, komputer memiliki bagian-bagian ini) - Menerima semua nilai yang diperlukan melalui constructornya untuk membuat kedua komponen secara internal
- Memiliki method
boot()yang mendelegasikan tugas kepada kedua komponen dan mencetak tiga baris: nama komputer diikutistarting..., lalu hasil method process dari CPU, kemudian hasil method load dari Memory - Memiliki method
specs()yang mengembalikan string untuk menjelaskan sistem:[name]: [brand] [speedGHz]GHz, [sizeGB]GB RAM
- Memiliki field
main.dart: Impor file-filemu dan tunjukkan cara kerja komposisi:- Buat
ComputerbernamaWorkstationdengan CPUIntelyang berjalan pada3.5GHz dan memori16GB - Panggil method
boot() - Cetak hasil
specs()
- Buat
Perhatikan bahwa class Computer tidak mewarisi CPU atau Memory, class ini memuat keduanya dan mendelegasikan pekerjaan kepada keduanya. Inilah hubungan "has-a" yang dihasilkan oleh komposisi!
Output yang diharapkan:
Workstation starting...
Intel processing at 3.5GHz
Loading 16GB of data
Workstation: Intel 3.5GHz, 16GB RAMCoba sendiri
import 'computer.dart';
void main() {
// TODO: Buat Computer bernama "Workstation" dengan:
// - CPU Intel yang berjalan pada 3.5 GHz
// - Memori 16 GB
// TODO: Panggil method boot()
// TODO: Cetak hasil specs()
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik13Konsep OOP Lanjutan
Komposisi vs PewarisanExtension methodClass yang Dapat DipanggilSealed class (Dart 3)Records (Dart 3)Pola dan Pencocokan (3.0)Enum dengan method2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses PembayaranLatihan sendiri: Compiler Dart online