class Foo {
var str = "hi";
func refresh() {
println(self.str);
}
}
class Bar: Foo {
// override str in init
// create Zed with parent = self
}
class Baz: Foo {
// override str in init
// create Zed with parent = self
}
class Zed {
var parent: Foo?; // I want it to work for both Bar and Baz
// call parent.refresh() in init
}我希望类Zed拥有一个同时适用于Bar和Baz类的属性。这个是可能的吗?
发布于 2014-12-03 08:20:08
我不明白这个问题,因为在我看来,这段代码很好:
class Foo {
var str = "hi";
func refresh() {
println(self.str);
}
}
class Bar: Foo {
override init () {
super.init()
str = "bar"
let zed = Zed(parent: self)
}
}
class Baz: Foo {
override init () {
super.init()
str = "baz"
let zed = Zed(parent: self)
}
}
class Zed {
var parent: Foo?; // I want it to work for both Bar and Baz
init(parent: Foo) {
self.parent = parent
self.parent?.refresh()
}
}
let b = Bar() // prints bar
let c = Baz() // prints baz如果问题是如何确保Zed的父母不允许Foo的其他子类:没有办法在Swift的类型约束中指定“或”约束,但您可以在Bar和Baz中采用相同的协议,并将该协议指定为parent的类型:
protocol CanRefresh
{
func refresh()
}
extension Bar : CanRefresh
{
}
extension Baz : CanRefresh
{
}
class Zed {
var parent: CanRefresh?; // I want it to work for both Bar and Baz
init(parent: CanRefresh) {
self.parent = parent
self.parent?.refresh()
}
}通过这种方式,您可以显式列出Zed支持的类(但这是一个非常糟糕的API设计;您应该发布协议,让任何想要这样做的人都符合该协议)。
发布于 2014-12-03 08:17:58
我能想到的最接近的是对父类使用协议。
protocol FooProtocol {
var str: String { get set }
func refresh()
}
class Foo {
var str = "hi"
func refresh() {
println(self.str)
}
}Foo现在符合FooProtocol,尽管它没有直接实现它。这样,继承自Foo的每个类也都符合协议。
class Bar: Foo, FooProtocol {
override init() {
super.init()
self.str = "ho"
}
}
class Baz: Foo, FooProtocol {
override init() {
super.init()
self.str = "hup"
}
}现在您应该能够在ZedtoFooProtocol中设置ZedtoFooProtocol的类型。然后,它可以是Bar或Baz的实例。
class Zed {
var parent: FooProtocol?
}https://stackoverflow.com/questions/27266343
复制相似问题