Intereting Posts
Kotlin – Идиоматический способ проверки массива содержит значение Обнаруживать конфликты просмотров и предотвращать перенасыщение Почему я не могу добавить два номера в Котлин, используя этот исходный код? Android Kotlin рассчитывает темп (время) Внедрить только один метод из интерфейса в анонимном классе Kotlin: Запуск kapt в командной строке для создания заглушек для DI Связывание слушателя; Не удается найти сеттер Как изменить карту в Котлине? Asynctask несколько последовательных запросов URL в Android Ошибка «неразрешенной ссылки» в Kotlin Android Имеет ли Kotlin стандартный способ форматирования числа в качестве английского ординала? Kotlin enum реализует интерфейс Java с объявлением String name () kotlin как ссылаться на внешнюю область в многослойных приложениях Как упростить несколько проверок равных в условии if? Android – Kotlin – Dagger – Нет такого исключения метода

Kotlin: Как дочерний конструктор может использовать вторичный конструктор своего родителя?

Например, у нас есть этот родитель:

open class Parent(val id: Int, val name: String?) { constructor() : this(-1, null) } 

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

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : super() // syntax error } 

Как дочерний конструктор может использовать вторичный конструктор своего родителя?

Я знаю, что я могу реализовать дочерний конструктор, передающий те же значения, что и родительский, но это не только кажется избыточным, но и часто, когда мои дочерние элементы имеют дополнительные параметры для его основного конструктора, но не требуют промежуточных конструкторов (конструкторы с параметрами которые не включают все дополнительные параметры). Вот пример ребенка, реализующий его таким образом, на случай, если я не понял:

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null) // no syntax error, but redundant } 

Лучший способ достичь этого – imho, используя параметры по умолчанию для вашего конструктора

 class Child(id: Int = -1, name: String? = null) : Parent(id, name) 

В зависимости от того, какое влияние вы оказываете на Parent класс, возможно, даже

 class Parent(val id: Int = -1, val name: String? = null) 

У этого есть один «недостаток», хотя: вы получите технически три разных конструктора. Но я не вижу, как это может быть проблемой, поскольку в любом случае вы должны обрабатывать id=-1 и name=null .

Кроме того, я не думаю, что ваше решение

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null) } 

является плохим или «избыточным» в любом случае – наоборот: он очень выразительный и явный, поэтому читатель точно знает, что вы сделали.

Во-первых, вы не можете Parent класс Parent поскольку он не open .

Во-вторых, если класс объявил первичный конструктор, вы не можете вызвать конструктор суперкласса через super ключевое слово.

С другой стороны, если вы хотите вызвать конструктор суперкассы по ключевому слову super . вам нужно сделать первичный конструктор вторичным конструктором, например:

 class Child : Parent { constructor(id: Int, name: String?) : super(id, name) constructor() : super() } 

Другой вариант – позволить второму конструктору вызвать основной конструктор по this ключевому слову, но я думаю, что это необязательно и дублирует параметры со вторичным конструктором суперкласса:

 class Child(id: Int, name: String?) : Parent(id, name) { constructor() : this(-1, null); }