swift - 从具有相同父类(super class)的多个类继承 - 解决方法

标签 swift swift3

以下情况:

class Sprite{ // has to be a class, not a protocol!
    func s(); // can not be changed
}
class Element: Sprite{
    // needs s(); for:
    func e();
}
class Wiggle: Sprite{
    // needs s(); for:
    func w();
}

我怎样才能实现这样的目标:

class Button: Wiggle{
    // needs s();
    // needs w();
}
class Cursor: Element, Wiggle{
    // needs s();
    // needs w();
    // needs e();
}
class Pointer: Element{
    // needs w();
    // needs e();
}

这不起作用,因为 Cursor Wiggle 和 Element 都继承自 Sprite。

因此我正在考虑使用扩展方法,例如:

class Button:Sprite{
    // needs s();
    // needs w();
}
class Cursor: Element{
    // needs s();
    // needs w();
    // needs e();
}
class Pointer: Element{
    // needs w();
    // needs e();
}

extension Button, Cursor { // or similar to make w() available in Button & Cursor
    // using s() for:
    // func w();
}

如何一步扩展 ButtonCursor

最佳答案

您可以将 w() 放入其自己的协议(protocol)中,例如WableButtonCursor 符合。为 Wable 提供 w() 的默认实现。由于 w() 依赖于 s(),因此您必须对扩展施加约束,使其仅适用于从 Sprite 派生的符合类型>(s() 的“源”)。

class Button: Sprite, Wable {
    // needs s(); inherited from Sprite
    // needs w(); inherited from Wable
}

class Cursor: Element, Wable {
    // needs s(); inherited from Sprite
    // needs w(); inherited from Wable
    // needs e(); inherited from Element
}

class Pointer: Element, Wable  {
    // needs w(); inherited from Wable
    // needs e(); inherited from Element
}

protocol Wable {
    func W()
}

extension Wable where Self : Sprite {
    func W() {
        print("foo")
    }
}

关于swift - 从具有相同父类(super class)的多个类继承 - 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38132916/

相关文章:

ios - 自定义导航栏不是矩形

swift - 无法将类型 'NSRange'(又名 'NSRange')的值转换为预期参数类型 'Range<Index>'(又名 'Range<Int>')

ios - 尝试根据触摸位置为图像过滤器制作 kCIInputCenterKey 并翻转 y 坐标

ios - 在 Swift3 中排序

ios - 根据屏幕分辨率动态字体大小、样式

ios - 如何避免 bool 标志?

ios - 使用自动布局 Swift 定位 uibutton

ios - 图像在 iPhone 8 和 8 plus 上呈现不同

IOS Swift 如何在 TableView 中单击时获取元素的值

ios - Swift - 自定义 View 以显示空表格单元格