我想“制作”一些类似于基类但基础类型不同的类实例。(与网上看到的典型“动物”类工厂示例不太一样!)
下面的代码接近工作,但它需要用户“向上转换”make结果,如下所示:
var f1 = FOO.make(version: FOO.Ver.f1) as! FOO1_32
除了 FOO 之外,我不希望用户知道特定的类类型。我看过其他建议,它们都表明解决方案是使用符合协议的泛型类型定义 make,如下所示:
make<T: FOOProtocol>(version: Ver = .f1) -> T
但是,这给了我在调用 FOO.make(version: FOO.Ver.f1) 时出现的错误“无法推断通用参数'T'”
有人知道怎么做吗?我的游乐场代码如下。
protocol FOOProtocol
{
associatedtype FOOtype
var value: FOOtype {get set}
}
class FOO
{
enum Ver
{
case f1
case f2
}
class func make(version: Ver = .f1) -> FOO
{
print("FOO make")
switch version
{
case .f1:
return FOO1_32()
case .f2:
return FOO2_64()
}
}
}
class FOO1_32: FOO, FOOProtocol
{
typealias FOOtype = UInt32
private var fooVal: UInt32 = 0
var value: UInt32
{
get { return self.fooVal }
set { self.fooVal = newValue }
}
override init()
{
print("FOO1_32 init")
self.fooVal = 132
}
}
class FOO2_64: FOO, FOOProtocol
{
typealias FOOtype = UInt64
private var fooVal: UInt64 = 0
var value: UInt64
{
get { return self.fooVal }
set { self.fooVal = newValue }
}
override init()
{
print("FOO2_64 init")
self.fooVal = 264
}
}
var f1 = FOO.make(version: FOO.Ver.f1) // requires: as! FOO1_32
let f1v = f1.value
print("\(f1v)")
var f2 = FOO.make(version: FOO.Ver.f2) // requires: as! FOO2_64
let f2v = f2.value
print("\(f2v)")