我想“制作”一些类似于基类的类实例,但底层类型不同。 (与网上看到的典型“动物”级工厂示例不完全相同!)
下面的代码接近工作,但它要求用户“转发”make结果,如:
var f1 = FOO.make(version: FOO.Ver.f1) as! FOO1_32
我不希望用户知道特定的类类型,除了它是FOO。我已经看到了其他提议,它们都表明解决方案是使用符合协议的泛型类型定义make,如:
make<T: FOOProtocol>(version: Ver = .f1) -> T
然而,这给我一个错误“在FOO.make(版本:FOO.Ver.f1)的调用中无法推断出通用参数'T'
任何人都知道如何做到这一点?我的Playground代码如下。
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)")