Privasi Tingkat library
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 32 dari 110.
Di Dart, privasi diterapkan pada tingkat library, bukan pada tingkat class. Ini merupakan perbedaan penting dari bahasa seperti Java atau C++. Library di Dart biasanya berupa satu file atau beberapa file yang dihubungkan dengan direktif part.
Anggota privat (yang diawali dengan _) dapat diakses di mana saja dalam library yang sama, bahkan dari class lain:
// Kedua class berada dalam file yang sama (library yang sama)
class Engine {
int _horsepower = 200; // Hanya bisa diakses dalam library ini
}
class Car {
void showPower(Engine engine) {
print(engine._horsepower); // Bisa diakses! Masih dalam library yang sama
}
}Namun, saat kamu mengimpor class dari file yang berbeda, anggota privatnya benar-benar tersembunyi:
// file: engine.dart
class Engine {
int _horsepower = 200;
int get power => _horsepower;
}
// file: main.dart
import 'engine.dart';
void main() {
var engine = Engine();
// print(engine._horsepower); // error! Tidak dapat diakses
print(engine.power); // Berfungsi, menggunakan getter publik
}Privasi tingkat library ini memungkinkan class dalam file yang sama bekerja sama dengan erat sambil tetap menyembunyikan detail implementasi dari kode eksternal. Ini adalah pilihan desain yang disengaja untuk mendorong pengorganisasian class yang berkaitan dalam library yang sama.
Tantangan
MudahMari buat sistem kolaborasi tim yang menunjukkan cara kerja privasi tingkat library di Dart. Kamu akan melihat cara class dalam file yang sama dapat mengakses member privat satu sama lain, sedangkan kode dalam file terpisah tidak bisa.
Kamu akan mengatur kodemu dalam dua file:
team.dart: File ini akan berisi dua class yang bekerja sama erat dalam library yang sama:- Class
MemberdenganString nameyang bersifat publik danint _performanceScoreyang bersifat privat, dengan nilai awal50. Sertakan constructor yang menerima nama, serta getter publikperformanceScoreyang mengembalikan skor privat tersebut. - Class
TeamLeaddalam file yang sama, yang dapat mengakses field privat milikMembersecara langsung (karena keduanya berada dalam library yang sama). Class ini harus memilikiString namepublik, constructor yang menerima nama, dan methodevaluateMember(Member member)yang mengaksesmember._performanceScoresecara langsung, menambahkan10ke nilainya, lalu mencetak[leadName] boosted [memberName]'s score to [newScore].
- Class
main.dart: Impor file timmu dan tunjukkan perbedaan akses:- Buat
Memberbernama'Alice' - Buat
TeamLeadbernama'Bob' - Cetak
Initial score: [score]menggunakan getter publik milik Alice - Minta Bob mengevaluasi Alice menggunakan
evaluateMember - Cetak
Updated score: [score]menggunakan getter publik - Cetak
Direct access from main: Not allowed(ini mengingatkan kita bahwamain.darttidak dapat mengakses_performanceScoresecara langsung karena berada dalam library yang berbeda)
- Buat
Inti pentingnya adalah TeamLead dapat membaca dan mengubah _performanceScore privat milik Member secara langsung karena kedua class berada dalam file yang sama (library yang sama). Namun, kode dalam main.dart harus menggunakan getter publik karena berada dalam library yang berbeda.
Output yang diharapkan:
Initial score: 50
Bob boosted Alice's score to 60
Updated score: 60
Direct access from main: Not allowedCoba sendiri
import 'team.dart';
void main() {
// TODO: Buat Member bernama 'Alice'
// TODO: Buat TeamLead bernama 'Bob'
// TODO: Cetak "Initial score: [score]" menggunakan getter publik pada Alice
// TODO: Minta Bob mengevaluasi Alice menggunakan evaluateMember
// TODO: Cetak "Updated score: [score]" menggunakan getter publik
// TODO: Cetak "Direct access from main: Not allowed"
// Note: Kita tidak bisa mengakses alice._performanceScore di sini karena
// main.dart berada di library yang berbeda dari team.dart
}
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 Generik2Konstruktor 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