首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迅速继承问题

迅速继承问题
EN

Stack Overflow用户
提问于 2014-12-03 07:52:25
回答 2查看 96关注 0票数 0
代码语言:javascript
复制
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类的属性。这个是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-03 08:20:08

我不明白这个问题,因为在我看来,这段代码很好:

代码语言:javascript
复制
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的类型:

代码语言:javascript
复制
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设计;您应该发布协议,让任何想要这样做的人都符合该协议)。

票数 0
EN

Stack Overflow用户

发布于 2014-12-03 08:17:58

我能想到的最接近的是对父类使用协议

代码语言:javascript
复制
protocol FooProtocol {
  var str: String { get set }
  func refresh()
}

class Foo {
  var str = "hi"

  func refresh() {
    println(self.str)
  }
}

Foo现在符合FooProtocol,尽管它没有直接实现它。这样,继承自Foo的每个类也都符合协议。

代码语言:javascript
复制
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的实例。

代码语言:javascript
复制
class Zed {
  var parent: FooProtocol?
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27266343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档