#swift #inheritance #swiftui #subclass #return-type
#swift #наследование #swiftui #подкласс #возвращаемый тип
Вопрос:
Рассмотрим следующий код:
class A {}
class B: A {}
protocol P {
var a: A {get}
}
class P1: P {
let a: A = B() // No problem
}
class P2: P {
let a: B = B() // Can't compile!!
}
Поскольку B
это подкласс of A
, почему мы не можем сделать B
в качестве возвращаемого типа of var a
?
Комментарии:
1. Я полагаю, это потому, что ваш протокол имеет переменную или тип A, а не B, а B является подклассом A. Итак, P2 понятия не имеет, какой тип B.
2. Уважаемый пользователь, теперь все ясно по вашему вопросу?
3. Я думаю, что это ограничение Swift. На других языках, таких как Scala, Java и Kotlin, объявление в
P2
порядке.
Ответ №1:
Вы не можете этого сделать, потому P
что протокол специально запрашивает у соответствующего класса свойство type A
.
Вы всегда можете использовать associatedtype
обобщения и в своем протоколе:
class A {}
class B: A {}
protocol P {
associatedtype T: A
var a: T { get }
}
class P1: P {
let a: A = B()
}
class P2: P {
let a: B = B()
}
Однако имейте в виду, что если вы это сделаете, вы не сможете использовать P
протокол как тип напрямую, а только с дженериками:
Ответ №2:
class A {}
class B: A {}
protocol P {
var a: A {get}
}
class P1: P {
let a: A = B() // No problem
}
class P1x: P {
let a = A() // No problem
}
class P1y: P {
var a = A()
let b: B = B() // No problem
}
Теперь ваша запутанная точка :
class P2: P {
let a: B = B() // Can't compile!
}
Потому что a принадлежит типу A, а не B, как указано в протоколе B !