栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

您如何实现返回协变Selfs的协议方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

您如何实现返回协变Selfs的协议方法?

正如它所说,您不能这样做,这是有充分理由的。您无法证明自己会信守诺言。考虑一下:

class AnotherSubclass: Class {}let x = AnotherSubclass().instance

因此,

x
AnotherSubclass
根据您的协议(即
Self
)进行操作。但实际上是
Subclass
,这是完全不同的类型。除非课程是,否则您无法解决这个悖论
final
。这不是Swift的限制。此限制在任何正确的类型系统中都将存在,因为它允许类型矛盾。

另一方面,您可以做的是保证

instance
在所有子类(即超类)中返回某种一致的类型。您可以使用关联的类型来执行此操作:

protocol Protocol {    typealias InstanceType    var instance: InstanceType {get}}class Class: Protocol {    var instance: Class {return Subclass()}}class Subclass: Class {}class AnotherSubclass: Class {}let x = AnotherSubclass().instance

现在

x
无疑是type
Class
。(它也碰巧是随机的其他子类,这很奇怪,但这就是代码所说的。)

顺便说一句,所有这些通常表明您确实应该使用子类化。组合和协议可能会在Swift中更好地解决此问题。问问自己,是否有任何

Subclass
实际需要成为的子类的原因
Class
。可以是符合相同协议的独立类型吗?当您摆脱子类并专注于协议时,各种问题都会消失。


我一直在考虑这个问题,也许可以找到您想要的东西。与其说所有子类都实现

instance
instance
不如将其作为扩展。如果您想返回其他内容,您仍然可以覆盖它。

protocol Protocol {    init()}class Class: Protocol {    required init() {}    var instance: Class { return Subclass() }}extension Protocol {    var instance: Self { return self.dynamicType.init() }}class Subclass: Class {}

这避免了继承问题(您不能通过

AnotherClass
这种方式创建相同的“ 返回错误的类型”)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/385453.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号