gpt4 book ai didi

swift - 从具有私有(private)初始化程序的类继承?

转载 作者:行者123 更新时间:2023-11-28 06:57:50 25 4
gpt4 key购买 nike

考虑 Swift 中的以下类层次结构:

Class Hierarchy

GMSMarker 是 GoogleMaps 库提供的一个类。它有两个公共(public)初始化程序(一个指定,一个方便)。

MapItem、ClusterItem 和 Cluster 是我的模型的一部分。我不想允许构建 MapItem 对象;只有 ClusterItems 和 Clusters。由于 Swift 没有抽象类,因此拥有一个私有(private)初始化器就足以满足我的目的。但是,鉴于 MapItem 从 GMSMarker 继承了一个方便的构造函数,我不能简单地将指定的初始化程序重写为私有(private)。

鉴于 Swift 中的初始化器继承规则,我能够阻止构造 MapItem 类的唯一方法是声明一个具有不同签名的新私有(private)初始化器,这样基类初始化器就不会被继承。

class MapItem : GMSMarker {

private init(dummyParam: Int) {
super.init()
}
}

到目前为止一切顺利。现在,在尝试为 ClusterItem 类创建初始化程序时,我遇到了问题。

class ClusterItem : MapItem {

weak var post: Post?

init(post: Post) {
self.post = post
super.init(dummyParam: 0)
}
}

我在调用 super.init() 的行上收到以下编译器错误:“MapItem”没有名为“init”的成员

如果我省略对 super.init 的调用,我会收到以下错误:Super.init isn't called before return from initializer

有什么方法可以快速完成我想要的。我想尽可能保持继承层次结构,因为 MapItem 包含 ClusterItem 和 Cluster 的一些通用实现代码。此外,我希望能够使用 MapItems 的集合来引用 ClusterItems 和 Clusters。

最佳答案

有多种方法可以解决这个问题:

  1. 将初始化器声明为internal,这将为您提供模块访问权限,您的子类将能够调用它。

  2. 在同一文件中声明类,然后 private 将不再是问题(private 允许从同一文件访问)。

  3. 您可以将MapItem 设为协议(protocol) 而不是抽象类,ClusterItemCluster 可以直接继承自GMSMarker。但是,根据您的具体需求,此解决方案可能并不好。

关于swift - 从具有私有(private)初始化程序的类继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32869300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com