【发布时间】:2017-02-01 23:18:42
【问题描述】:
我知道协议和协议扩展是模拟抽象类的最佳方式,但我认为我想做的需要真正的抽象类。
我想要一个 BaseCollectionViewCell 和一个 BaseCollectionViewSource 一起工作。您将数组传递给BaseCollectionViewSource 的子类并实现一个返回重用标识符的方法。该单元格将由BaseCollectionViewSource 实例化,并有一个方法setData 将在具体的collectionViewCell 中被覆盖。
我实际上想做的是:
abstract class WRBaseCollectionViewCell: UICollectionViewCell {
abstract func setData(_ data: AnyObject)
}
但我无法用 Swift 来模拟这一点(我认为)。协议不能从类继承,也没有动态调度,这扼杀了我对所有东西都可以覆盖的想法。
有人知道怎么做吗?可能是工厂?我想尽可能简单地实现一个新的 collectionView。
【问题讨论】:
-
Swift 没有抽象类。和 IMO 它不需要它们。借助泛型和协议——尤其是 协议扩展——swift 提供了丰富的工具集。
-
@vikingosegundo 你对我的问题有具体的解决方案吗?我不是要求更改语言,我想尽可能地实现这一点。
-
因为你的具体例子:你可能看看我最近开始的一个项目:TaCoPopulator,一个用于集合和表格视图的数据源框架。
-
老实说,我不明白你在这里想说什么:协议不能从类继承,也没有动态调度,这扼杀了我对所有东西都可以覆盖的想法。我>
-
@vikingosegundo 我希望我的所有方法都可以在具体类中被覆盖,但是如果没有动态调度,就无法通过使用协议扩展来做到这一点。另外,我不能让我的协议继承自
UICollectionViewCell,我必须同时实现UICollectionViewCell和我的协议并不断使用as!来使用它们,这并不好。这些事情在具有抽象类的语言中是可能的,例如 Java 和 C#。我只是想知道在 Swift 中最好的方法是什么。
标签: swift oop inheritance uicollectionview