2016-06-30 2 views
0

После ситуации:Наследование от нескольких классов, которые имеют один и тот же супер класс - как обойти

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(); 
} 

Это не работает, так как для курсора покачивание и Element как наследовать от Спрайт.

Поэтому я думал об использовании подхода расширения как:

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 в одном шаге?

+1

Используйте [протоколы] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html). – Alexander

+0

Как я уже упоминал, Sprite должен быть классом, а не протоколом, поскольку он уже реализован (не мной). – cocoseis

+0

Можете ли вы его переделать? – Alexander

ответ

1

Вы можете поместить свой w() в свой собственный протокол, например. 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") 
    } 
} 
+0

Как свойства работают в Wable? – cocoseis

+0

См. [Быстрый язык программирования (Swift 2.2) - Protocls - Требования к свойствам] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID269) – Alexander

+0

конечно, но он дает мне «Нельзя присваивать свойство:« Я »неизменен» – cocoseis

Смежные вопросы