Modyfikatory widoczności
Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 8 z 57.
Enkapsulacja oznacza, że klasa kontroluje sposób używania swoich danych. Modyfikatory dostępu określają, kto może widzieć składową. private ukrywa ją przed wszystkim, co znajduje się poza klasą, więc jedynym sposobem dostępu są metody samej klasy:
class Account {
private var balance = 0
fun deposit(amount: Int) {
if (amount > 0) balance += amount
}
fun report() = "balance: $balance"
}Wewnątrz main:
val a = Account()
a.deposit(50)
a.deposit(-999)
println(a.report())
// a.balance = 1_000_000 // błąd: nie można uzyskać dostępu do 'balance': jest prywatneWynik:
balance: 50Kotlin ma cztery modyfikatory. Bez żadnego z nich deklaracja jest public, czyli widoczna wszędzie:
public // domyślnie: widoczny wszędzie
internal // widoczny w tym samym module (aplikacji lub bibliotece)
protected // widoczny w klasie i jej podklasach
private // widoczny wewnątrz klasy (lub pliku, w przypadku deklaracji najwyższego poziomu)Prywatne funkcje pomocnicze ograniczają publiczny interfejs do minimum. Wywołujący widzą, co robi klasa, a nie jak:
class Password(private val text: String) {
val isStrong: Boolean
get() = hasDigit() && text.length >= 8
private fun hasDigit() = text.any { it.isDigit() }
}Wewnątrz main:
println(Password("secret123").isStrong)
println(Password("short1").isStrong)Wynik:
true
falseWłaściwości konstruktora również mogą mieć modyfikatory: private val przechowuje wartość, której kod spoza klasy nie może odczytać. Ukrywanie danych pozwala klasie sprawdzać każdą zmianę i przestrzegać swoich reguł:
class Locker(private val code: String) {
private val items = mutableListOf<String>()
fun store(item: String, code: String): Boolean {
if (code != this.code) return false
items.add(item)
return true
}
}Wyzwanie
ŁatwyUzupełnij klasę Locker(private val code: String). Jej lista items jest prywatna. store(item, code) dodaje element tylko wtedy, gdy kod jest zgodny, i zwraca informację, czy go dodano; open(code) zwraca elementy połączone za pomocą , (lub empty), gdy kod jest zgodny, a w przeciwnym razie wrong code.
Dostarczony kod odczytuje kod do skrytki, a następnie polecenia put <code> <item> lub open <code>. Dla każdego polecenia put wypisuje stored lub denied, a dla każdego polecenia open — jego wynik.
Umieść swój kod w pliku Locker.kt. Plik Main.kt zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
fun main() {
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
val input = generateSequence(::readLine).toList()
val locker = Locker(input[0])
for (cmd in input.drop(1)) {
val p = cmd.split(" ")
if (p[0] == "put") println(if (locker.store(p[2], p[1])) "stored" else "denied")
else println(locker.open(p[1]))
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasKonstruktory główneBloki init i walidacjaKonstruktory dodatkowePodsumowanie — karta biblioteczna4Dziedziczenie
Klasy otwarte i podklasyNadpisywanie składowychsuper i konstruktoryKlasy abstrakcyjnePodsumowanie – katalog pracowników7Klasy specjalne
Klasy danychKlasy wyliczenioweHierarchie zapieczętowaneequals, hashCode, toStringPodsumowanie — śledzenie zamówień10Wzorce projektowe, część 2
Delegowanie za pomocą byWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Właściwości i hermetyzacja
Własne akcesoryModyfikatory widocznościPrywatne setterylazy i lateinitPowtórka – konto bankowe5Interfejsy
Deklarowanie interfejsówMetody domyślneWiele interfejsówInterfejsy jako typyPowtórzenie – metody płatności8Typy generyczne
Funkcje generyczneKlasy generyczneOgraniczenia typówKowariancja i kontrawariancja: in i outPodsumowanie — kolejka priorytetowa11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Kotlin