以下情况:
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();
}
如何一步扩展 Button
和 Cursor
?
最佳答案
您可以将 w()
放入其自己的协议(protocol)中,例如Wable
,Button
和 Cursor
符合。为 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/