我正在做类似于JAVA中的桥接模式的事情,DriverType
是一个协议需要一个名为vehicle
成为一个Drivable
目的,Drivable
也是一个协议,被“Car”类采用
protocol Drivable {
var speed: Double { get }
}
protocol DriverType {
var vehicle: Drivable { get }
}
class Car: Drivable {
var speed = 80.0;
var brand = "BMW"
}
class Driver: DriverType {
var vehicle: Car = Car() //Error: Type 'Driver' does not conform to protocol 'DriverType'
// This one works, but I have to downcast the property to 'Car' everytime I use it.
var vehicle: Drivable = Car() //Type 'Driver' does not conform to protocol 'DriverType'
}
当我实施Driver
类,很自然地声明vehicle
财产作为Car
。但后来我遇到了编译器认为的问题Driver
不符合DriverType
虽然Car
符合Drivable
完美。
UPDATE:
@Antonio 的答案是可靠的,但这就是我目前解决的问题,它不涉及类的泛型。
protocol Drivable {
var speed: Double { get }
init()
}
protocol DriverType {
func vehicle() -> Drivable
}
class Car: Drivable {
var speed = 80.0;
var brand = "BMW"
required init() {}
}
class Driver: DriverType {
private var m_vehicle: Car = Car()
func vehicle() -> Drivable {
return m_vehicle
}
// Inside Driver class I use the m_vehicle property directly
}
我认为编译器错误具有误导性。DriverType
声明任何采用它的类都必须暴露一个vehicle
财产与Drivable
类型,而不是具有采用以下类型的类类型的属性Drivable
type.
我将通过定义两个来解决这个问题DriverType
协议和Car
使用泛型的类:
protocol Drivable {
var speed: Double { get }
init()
}
protocol DriverType {
typealias T: Drivable
var vehicle: T { get }
}
class Car: Drivable {
var speed = 80.0;
var brand = "BMW"
required init() {}
}
class Driver<T: Drivable>: DriverType {
var vehicle: T = T()
}
这明确指出,类采用DriverType
必须暴露一个vehicle
其类型是采用以下任何类的属性Drivable
协议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)