co prosicie, nie istnieje, to wydaje się być pytanie:
Mogę odwołać metodę obiektu towarzysz nadklasie z odniesieniem klasowej jego potomków
lub może pytasz:
Czy mogę odwołać się do statycznego członka nadklasy z referencji jego potomków.
Odpowiedź dla obu jest nr. Jest według projektu z Kotlin, że jest to niedozwolone, było świadomą decyzją, było celowe. Jeśli chcesz zmienić tę decyzję, musisz file an issue in YouTrack. Programiści w języku Java byli mocno zdezorientowani przez dziedziczenie i nadpisywanie metod statycznych i zachowanie, gdy są wywoływane z jednego odniesienia w stosunku do drugiego i sposób jest statycznie rozwiązany, a nie dynamicznie. Zespół Javy 8 przy dodawaniu statycznych metod do interfejsów zdaje sobie sprawę z zamieszania, jakie mogłoby to spowodować, więc przyjęli oni więcej niż tylko metody Kotlin, pozwalając na wywoływanie ich przez odniesienie do interfejsu. Aby uniknąć tego rodzaju koszmarów, zespół Kotlin go odrzucił. Tak jak nie dopuszczali wielu innych mylących aspektów Javy.
Inne odpowiedzi (na przykład @ voddan) dają możliwość obejścia, aby wywoływać taką samą składnię, używając companion objects, ale odrzucasz te komentarze, mówiąc, że chcesz uniknąć obiektu towarzyszącego, nawet jeśli pyta stany, których próbujesz użyć. Zakładając, że nie chcesz ich używać, odpowiedź brzmi po prostu nie, nie można tego zrobić.
Aby pozbyć się obiektu towarzyszącego, chciałbyś porozmawiać o Can extension functions be called in a “static” way? ... co będzie rozczarowujące, ponieważ nie jest jeszcze dozwolone.
Wracając do obiektów towarzyszących (przepraszam, ale to jedna droga do chwały tutaj), można też po prostu ręcznie delegować metodę dziecka do rodzica:
open class Parent {
companion object { // required, sorry, no way around it!
fun foo() = /* some cool logic here */
}
}
class Child: Parent() {
companion object { // required, sorry, no way around it!
fun foo() = Parent.foo()
}
}
lub jako rozszerzenia:
open class Parent {
companion object {} // required, sorry, no way around it!
}
class Child: Parent() {
companion object {} // required, sorry, no way around it!
}
fun Parent.Companion.foo() = /* some cool logic here */
fun Child.Companion.foo() = Parent.foo()
Do czego służy funkcja dziedziczenia statycznego ??? –
@DanielTran Cóż, niekoniecznie jest "statyczne", ponieważ jest to Kotlin. Celem jest stworzenie "alternatywnego operatora" do budowy, np. 'Dziecko [1, 2, 3]' zamiast 'Dziecko (1, 2, 3)' – Jire
@DanielTran Co powiesz na przykład na egzekwowanie metod fabrycznych dla klas potomnych? – IARI