Я пытаюсь реализовать не тривиальную (по крайней мере, для моего уровня) взаимосвязь между типами.Определить переменную, которая соответствует более чем одному протоколу/протоколу + суперкласс
класса A и B являются подклассами класса MySuperClass, и я позволяю им реализовать протокол «MyProtocol»
class MySuperclass {...}
protocol MyProtocol {
func myProtocolMethod()
}
class A:MySuperclass, MyProtocol {...}
class B:MySuperclass, MyProtocol {...}
Мой класс «Контейнер» имеет переменную х, которая может быть либо экземпляром A или B
class Container {... var x:???? ....}
Как может быть возможно из-за ???? моя проблема в том, что я бы хотел, чтобы я мог использовать x как MyProtocol, так и MySuperclass.
Только сегодня я решил очень похожую проблему в this thread, и я думал, что могу применить это здесь, но я не преуспеваю.
Идея заключалась бы в том, чтобы объявить тип переменной таким образом, чтобы она удовлетворяла ограничению <T where T:MySuperclass, T:MyProtocol>
, но где я это помещаю? Все, что я пробовал до сих пор, на самом деле не имело смысла и не получилось.
Я пытался, например:
class Container<T where T:MySuperclass, T:MyProtocol>
class Container {... var x:T ...}
но экземпляр и назначить T в Container
, и когда я делаю это я получаю ошибку компиляции:
class Container {... self.x = A() ....}
«Тип A не является конвертируемой to 'T' "
Но на самом деле это должно быть потому, что A удовлетворяет ограничениям типа.
Редактировать: Спасибо arshajii's anwer Я понял, почему это невозможно. Но мне все еще нужно знать, как решить мою первоначальную проблему.
Я не знаю, действительно ли дженерики - правильный подход для этого. Я думаю, что мне не нужна переменная типа, мне нужно скорее нечто вроде совокупного типа ...
Редактировать 2- Я знаю, что могу реализовать это, просто выполнив подкласс. Было просто интересно, есть ли другие подходы. Но думать снова подкласс, кажется, лучший способ.
Заранее спасибо.
Спасибо! (+1) теперь я получаю эту часть. Но я до сих пор не знаю, как решить мою оригинальную проблему:/Может быть, я должен удалить тег Java, как решение того, что нужно специалисту Swift. – Ixx