我有几个以CellDataBase
为基类的单元格数据类。主要思想是我可以定义新的单元格数据类,并通过泛型将其与单元格配对。
public class CellBase { }
public class CellA: CellBase { }
public class CellB: CellBase { }
public class CellDataBase<U: CellBase> {
var cellType: U.Type = U.self
}
class CellDataA: CellDataBase<CellA> { }
class CellDataB: CellDataBase<CellB> { }
是否可以在其中定义数组并存储CellDataA
,CellDataB
等?
答案 0 :(得分:1)
不,这是不可能的,因为CellDataA
和CellDataB
有没有共同类型的祖先。您可能认为 CellDataBase
是一个共同的祖先,但事实并非如此;引入U
类型参数意味着对于每种类型U
,都有一个完全不同的类型。
您可以尝试这样的事情:
protocol CellDataBase {
// avoid `Self` and `associatedType`
// ...
var count : UInt { get } // number of items in database..
// ...
}
public class StandardCellDataBase<U: CellBase> : CellDataBase { ... }
class CellDataA: StandardCellDataBase <CellA> { }
class CellDataB: StandardCellDataBase <CellB> { }
然后:
var databases = [CellDataBase]()
请注意,根据您的需要,将CellDataBase
定义为避免“自我和相关类型要求”的协议可能会很困难。
<强> ==== 强>
另一个类似的选项,假设您无法更改CellDataBase
的定义,则定义另一个协议并将其添加为CellDataBase
的扩展名。像这样:
protocol GenericCellDataBase {
var count : UInt { get }
}
extension CellDataBase : GenericCellDataBase {
var count : UInt { return ... }
}
var databases = [GenericCellDataBase]()