Słowo kluczowe by
Deleguj implementację interfejsu
Słowo kluczowe by to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Czym jest delegowanie
Delegowanie klas pozwala jednemu obiektowi przekazać innemu obiektowi implementację interfejsu. Kotlin zapewnia wbudowaną obsługę tego mechanizmu za pomocą słowa kluczowego by.
To kompozycja bez zbędnego wysiłku.
Interfejs do delegowania
Należy zacząć od interfejsu i konkretnej implementacji. Później delegowanie będzie kierowane do tej implementacji.
interface Speaker {
fun speak(): String
}
class LoudSpeaker : Speaker {
override fun speak() = "HELLO!"
}
fun main() {
println(LoudSpeaker().speak())
}Słowo kluczowe by
Należy zapisać class X(d: Iface) : Iface by d. Kompilator generuje metody przekazujące wywołania do d dla każdego elementu interfejsu.
interface Speaker {
fun speak(): String
}
class LoudSpeaker : Speaker {
override fun speak() = "HELLO!"
}
class Announcer(s: Speaker) : Speaker by s
fun main() {
val a = Announcer(LoudSpeaker())
println(a.speak())
}Bez kodu szablonowego
Bez by każdą metodę przekazującą wywołanie dla każdej funkcji interfejsu trzeba byłoby napisać ręcznie. Delegowanie generuje je wszystkie automatycznie.
interface Repository {
fun save(item: String): String
fun count(): Int
}
class MemoryRepo : Repository {
private val items = mutableListOf<String>()
override fun save(item: String): String { items.add(item); return item }
override fun count() = items.size
}
class LoggingRepo(r: Repository) : Repository by r
fun main() {
val repo = LoggingRepo(MemoryRepo())
repo.save("a")
println(repo.count())
}Przesłanianie wybranych elementów
Można przesłonić tylko te elementy, które mają zostać dostosowane; pozostałe nadal będą przekazywać wywołania do delegata.
interface Repository {
fun save(item: String): String
fun count(): Int
}
class MemoryRepo : Repository {
private val items = mutableListOf<String>()
override fun save(item: String): String { items.add(item); return item }
override fun count() = items.size
}
class LoggingRepo(private val r: Repository) : Repository by r {
override fun save(item: String): String {
println("saving " + item)
return r.save(item)
}
}
fun main() {
val repo = LoggingRepo(MemoryRepo())
repo.save("book")
println(repo.count())
}Delegat jako parametr
Delegat jest zwykle przekazywany za pośrednictwem konstruktora głównego. Jeśli niektóre elementy są również przesłaniane, można zachować referencję za pomocą private val.
interface Clock { fun now(): Int }
class FixedClock : Clock { override fun now() = 12 }
class App(private val clock: Clock) : Clock by clock
fun main() {
println(App(FixedClock()).now())
}Delegowanie standardowych interfejsów
Można delegować do wbudowanych interfejsów kolekcji, natychmiast uzyskując opakowanie zachowujące się jak kolekcja bazowa.
class TaggedList(private val inner: List<String>) : List<String> by inner {
val tag = "v1"
}
fun main() {
val tl = TaggedList(listOf("x", "y"))
println(tl.size)
println(tl[0])
println(tl.tag)
}Jak odbywa się kompilacja
W tle kompilator przechowuje delegata i generuje implementacje przekazujące wywołania. Wygenerowane metody po prostu wywołują odpowiadającą im metodę delegata. To to samo co ręczne przekazywanie wywołań, ale bez konieczności pisania kodu.
Przechwycona referencja
Ważny szczegół: referencja do delegata jest przechwytywana podczas tworzenia obiektu. Przesłonięte elementy jawnie wywołują delegata, ale generowane metody przekazujące używają pierwotnie przekazanej instancji.
interface Source { fun value(): Int }
class Const(val n: Int) : Source { override fun value() = n }
class Wrapper(s: Source) : Source by s
fun main() {
val w = Wrapper(Const(42))
println(w.value())
}Dlaczego używać by
Słowo kluczowe by pozwala:
- Ponownie wykorzystać istniejące implementacje
- Dodawać zachowanie bez dziedziczenia
- Unikać kruchych hierarchii dziedziczenia
To pełnoprawna obsługa w Kotlinie zasady kompozycji zamiast dziedziczenia.
Podstawa
Słowo kluczowe by stanowi podstawę wszystkiego, co obejmuje ten kurs. Następnie przyjrzymy się dokładniej delegowaniu do obiektów składowych w celu komponowania zachowania.
Szybkie sprawdzenie
Warto sprawdzić zrozumienie słowa kluczowego by.
Podsumowanie
Omówiono delegowanie klas za pomocą by:
- Delegowanie interfejsu do innego obiektu
- Automatycznie generowane metody przekazujące wywołania
- Przesłanianie wybranych elementów przy przekazywaniu wywołań do pozostałych
- Obsługa także wbudowanych interfejsów
Następnie: delegowanie do elementów w celu komponowania zachowania.
Często zadawane pytania
Czy lekcja „Słowo kluczowe by” jest bezpłatna?
Tak — pełny tekst „Słowo kluczowe by” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Słowo kluczowe by”?
Deleguj implementację interfejsu Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?
Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Słowo kluczowe by”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?
Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.