Конструктор “основы” перегрузки или “этот” конструктор?

Есть ли конкретная причина, по которой вам нужно использовать средство сравнения beSameInstanceAs?

Вы можете сделать что-то вроде:

val suits = CardSuit.values() as Array<out ICardSuite>

suits.forEach {
    when (it.name) {
        "HEART" -> it shouldBe CardSuit.HEART
        "SPADE" -> it shouldBe CardSuit.SPADE
   }
}

Однако, если вы действительно хотите использовать beSameInstanceAs , вы можете:

suits.forEach {
    when(it.name) {
       "HEART" -> it shouldBeSameInstanceAs CardSuit.HEART
       "SPADE" -> it shouldBeSameInstanceAs CardSuit.SPADE
    }
}

Я не получаю никаких жалоб от компилятора здесь

7
задан Community 23 May 2017 в 12:15
поделиться

6 ответов

Это . Потому что, если вы когда-нибудь поместите код в ConcreteB (string, int?), Вы захотите, чтобы конструктор, содержащий только строки, вызывал его.

5
ответ дан 7 December 2019 в 01:26
поделиться

В общем, я бы назвал это, а не основание. Вы, вероятно, будете использовать больше кода таким образом, если позже расширитесь.

2
ответ дан 7 December 2019 в 01:26
поделиться

Хорошо смешивать и сочетать; в конечном счете, когда вы используете конструктор this (...) , он в конечном итоге попадет в ctor, который сначала вызывает base (...) . Имеет смысл повторно использовать логику там, где это необходимо.

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

2
ответ дан 7 December 2019 в 01:26
поделиться

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

1
ответ дан 7 December 2019 в 01:26
поделиться

Чтобы уменьшить сложность путей кода, я обычно стараюсь иметь ровно одну base () Вызов конструктора (случай ConcreteB ). Таким образом, вы знаете, что инициализация базового класса всегда происходит одинаково.

Однако, в зависимости от класса, который вы переопределяете, это может быть невозможно или добавить ненужную сложность. Это справедливо для специальных шаблонов конструктора, таких как шаблон при реализации ISerializable .

0
ответ дан 7 December 2019 в 01:26
поделиться

Еще раз спросите себя, почему вы перегружаете конструктор в базовом классе? Этого достаточно:

protected Base()

То же самое относится и к подклассу, если только вы не нуждаетесь ни в каких полях, чтобы иметь конкретное значение, когда вы создаете экземпляр, что в вашем примере не так, поскольку у вас уже есть конструктор по умолчанию.

Также помните, что любой конструктор должен привести экземпляр объекта в правильное состояние.

0
ответ дан 7 December 2019 в 01:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: