Есть ли конкретная причина, по которой вам нужно использовать средство сравнения 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
}
}
Я не получаю никаких жалоб от компилятора здесь
Это . Потому что, если вы когда-нибудь поместите код в ConcreteB (string, int?), Вы захотите, чтобы конструктор, содержащий только строки, вызывал его.
В общем, я бы назвал это, а не основание. Вы, вероятно, будете использовать больше кода таким образом, если позже расширитесь.
Хорошо смешивать и сочетать; в конечном счете, когда вы используете конструктор this (...)
, он в конечном итоге попадет в ctor, который сначала вызывает base (...)
. Имеет смысл повторно использовать логику там, где это необходимо.
Вы можете расположить ее так, чтобы все конструкторы вызывали общий (может быть частный) конструктор this (...)
, единственный, который вызывает вплоть до основания (...)
- но это зависит от того, является ли a: полезным это сделать, и b: существует ли одна база (...)
Котор, который позволит вам.
В вашем случае из того, что вы предоставили, это не имеет значения. Вы действительно хотите использовать этот
, когда у вас есть конструктор в вашем текущем классе, который не является частью вашего базового класса, или если в текущем конструкторе класса есть какой-то код, который вы хотите выполнить, который не ' т содержится в базовом классе.
Чтобы уменьшить сложность путей кода, я обычно стараюсь иметь ровно одну base () Вызов конструктора
(случай ConcreteB
). Таким образом, вы знаете, что инициализация базового класса всегда происходит одинаково.
Однако, в зависимости от класса, который вы переопределяете, это может быть невозможно или добавить ненужную сложность. Это справедливо для специальных шаблонов конструктора, таких как шаблон при реализации ISerializable .
Еще раз спросите себя, почему вы перегружаете конструктор в базовом классе? Этого достаточно:
protected Base()
То же самое относится и к подклассу, если только вы не нуждаетесь ни в каких полях, чтобы иметь конкретное значение, когда вы создаете экземпляр, что в вашем примере не так, поскольку у вас уже есть конструктор по умолчанию.
Также помните, что любой конструктор должен привести экземпляр объекта в правильное состояние.