Kotlin: расширить динамически заданный супертип - PullRequest
0 голосов
/ 13 февраля 2019

Предположим, у меня есть классы:

class A : SuperType() {}

class B : SuperType() {}

class C : B() {}

Предположим, я не хочу, чтобы C расширял B(): я хочу, чтобы он расширял A(), но теперь я хочу Aпродлить B().

Как сделать, чтобы во время компиляции A продлил B() (или любой дочерний элемент SuperType()) вместо только SuperType()?Другими словами, как я могу сделать объявление класса A универсальным, чтобы принять любого потомка SuperType()?

Надеюсь, это было ясно.Я хотел бы сделать что-то вроде:

class B(whatever_it_receives_as_long_as_child_of_SuperType) : whatever_it_receives_as_long_as_child_of_SuperType()

class C : A(B())    // B is subtype of SuperType so it's ok

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Как сделать во время компиляции расширение A B () (или любого потомка SuperType ()) вместо только SuperType ()?

Вы не можете,Каждый класс может расширять только один фиксированный суперкласс.

Я думаю, что ближайший вы можете получить

class A(x: SuperType): SuperType by x

(см. документация ), но для этого требуется SuperTypeинтерфейс вместо класса.

0 голосов
/ 13 февраля 2019

Вы можете сделать следующее:

open class SuperType {}
open class A(val obj: SuperType) : B() {}
open class B : SuperType() {}
class C : A(B())

или использовать дженерики:

open class SuperType {}
open class A<T: SuperType>(val obj: T) : B() {}
open class B : SuperType() {}
class C : A<B>(B())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...