Elementy publiczne a prywatne
Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 30 z 110.
Enkapsulacja to jedna z podstawowych zasad programowania obiektowego. Polega na kontrolowaniu dostępu do wewnętrznych danych klasy oraz decydowaniu o tym, co powinno być widoczne dla świata zewnętrznego, a co powinno pozostać ukryte.
W Dart elementy klasy (pola i metody) są domyślnie publiczne. Oznacza to, że każdy kod może uzyskać do nich bezpośredni dostęp:
class BankAccount {
String owner;
double balance;
BankAccount(this.owner, this.balance);
}
var account = BankAccount('Alice', 1000);
account.balance = -500; // Każdy może to bezpośrednio zmienić!To problematyczne. Nic nie zapobiega ustawieniu nieprawidłowego salda.
Aby chronić dane wewnętrzne, Dart używa prywatnych składowych. Składowa staje się prywatna, gdy jej nazwa zaczyna się od podkreślenia _:
class BankAccount {
String owner;
double _balance; // Prywatne – zaczyna się od podkreślenia
BankAccount(this.owner, this._balance);
double get balance => _balance; // Kontrolowany dostęp
}Teraz nie można uzyskać bezpośredniego dostępu do _balance spoza biblioteki, w której zdefiniowano klasę. Kod zewnętrzny musi zamiast tego używać publicznego gettera. Dzięki temu możesz kontrolować sposób odczytywania i modyfikowania danych, zapewniając, że Twoje obiekty zawsze pozostaną w prawidłowym stanie.
Wyzwanie
ŁatwyZbudujmy prosty menedżer haseł, który pokazuje różnicę między składowymi publicznymi a prywatnymi. Zobaczysz, jak prefiks podkreślenia chroni poufne dane przed bezpośrednim dostępem spoza biblioteki klasy.
Utworzysz dwa pliki, aby uporządkować kod:
credential.dart: Zdefiniuj klasęCredential, która przechowuje dane logowania do strony internetowej. Klasa powinna zawierać:- Publiczne
String website— każdy może wiedzieć, której strony to dotyczy - Publiczne
String username— nazwa użytkownika może być widoczna - Prywatne
String _password— rzeczywiste hasło musi być chronione - Konstruktor, który przyjmuje wszystkie trzy wartości
- Publiczny getter
password, który zwraca prywatne_password(kontrolowany dostęp) - Metodę
getMaskedPassword(), która zwraca hasło z wszystkimi znakami zastąpionymi gwiazdkami*(o tej samej długości co rzeczywiste hasło) - Metodę
displayCredential(), która bezpiecznie wyświetla dane logowania (pokazując zamaskowane hasło, a nie rzeczywiste)
- Publiczne
main.dart: Zaimportuj klasę danych logowania i pokaż, jak enkapsulacja chroni hasło:- Utwórz dane logowania do strony
'github.com', z nazwą użytkownika'dev_user'i hasłem'secret123' - Utwórz kolejne dane logowania do strony
'email.com', z nazwą użytkownika'john_doe'i hasłem'myP@ss' - Dla każdych danych logowania wywołaj
displayCredential(), a następnie wyświetlActual password length: [length], używając publicznego gettera do uzyskania długości hasła
- Utwórz dane logowania do strony
Metoda displayCredential() powinna wyświetlać dane w tym formacie:
--- Credential ---
Website: [website]
Username: [username]
Password: [maskedPassword]Oczekiwany wynik:
--- Credential ---
Website: github.com
Username: dev_user
Password: *********
Actual password length: 9
--- Credential ---
Website: email.com
Username: john_doe
Password: ******
Actual password length: 6Spróbuj swoich sił
import 'credential.dart';
void main() {
// TODO: Utwórz dane logowania dla github.com
// website: 'github.com', username: 'dev_user', password: 'secret123'
// TODO: Wywołaj displayCredential() dla pierwszych danych logowania
// TODO: Wypisz rzeczywistą długość hasła, używając publicznego gettera
// Format: "Actual password length: [length]"
// TODO: Utwórz dane logowania dla email.com
// website: 'email.com', username: 'john_doe', password: 'myP@ss'
// TODO: Wywołaj displayCredential() dla drugich danych logowania
// TODO: Wypisz rzeczywistą długość hasła, używając publicznego gettera
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP
Pliki zewnętrzneBiblioteki i importyWprowadzenie do OOPKlasy a obiektySłowo kluczowe thisMetodyZmienne instancjiPodstawy konstruktorówPowtórka – prosty kalkulator4Bezpieczeństwo wartości null
Wprowadzenie do bezpieczeństwa wartości nullTypy dopuszczające null i niedopuszczające nullOperatory ? i !Słowo kluczowe late a bezpieczeństwo wartości nullOperatory uwzględniające nullBezpieczeństwo wartości null w klasachPodsumowanie — system profili użytkowników7Klasy abstrakcyjne i interfejsy
Klasy abstrakcyjneMetody abstrakcyjneInterfejsy w DartInterfejsy niejawneImplementowanie a rozszerzanieWiele interfejsówPowtórka — kalkulator kształtów10Kolekcje i typy generyczne
Przegląd List, Set i MapKolekcje bezpieczne typowoKlasy generyczneMetody generyczneOgraniczenia typów generycznychIterable i IteratorPowtórka — generyczne przechowywanie danych13Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieMetody rozszerzająceKlasy wywoływalneKlasy zapieczętowane (Dart 3)Rekordy (Dart 3)Wzorce i dopasowywanie (3.0)Typy wyliczeniowe z metodami16Projekt: Zarządzanie biblioteką
Omówienie projektuKlasy książek i użytkowników2Konstruktory w Dart
Konstruktor domyślnyKonstruktory nazwaneListy inicjalizująceKonstruktory stałeKonstruktory fabryczneKonstruktory przekierowującePodsumowanie — budowanie kształtów5Hermetyzacja
Elementy publiczne a prywatneKonwencja prefiksu _Prywatność na poziomie bibliotekiGettery i settery — szczegółowoUkrywanie informacjiPodsumowanie — dane uczniów8Domieszki
Wprowadzenie do domieszekTworzenie domieszekKorzystanie z wielu domieszekSłowo kluczowe on w domieszkachDomieszka a dziedziczenieDomieszka a interfejsPodsumowanie – system zwierząt11Metody specjalne
Nadpisanie toString()Nadpisanie hashCode i ==Interfejs ComparableMetoda call()Nadpisanie noSuchMethodPodsumowanie — własna kolekcja14Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec Strategy3Właściwości klas
Elementy instancji a elementy statycznePola final i constZmienne inicjalizowane z opóźnieniemMetody i pola statyczneGettery i setteryPowtórzenie – menedżer kont bankowych6Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superPrzesłanianie metodAdnotacja @overrideSłowo kluczowe final dla klasKonstruktory i dziedziczeniePowtórzenie – hierarchia pracowników9Polimorfizm
Podstawy polimorfizmuPolimorfizm za pomocą interfejsówSprawdzanie typu w czasie działaniaOperatory is i asSłowo kluczowe covariantPodsumowanie — procesor płatnościPoćwicz samodzielnie: Kompilator Dart online