2015-06-27 45 views
2

我正试图在Swift中实现一个干净的OOP结构。 Swift 1.2和苹果新的面向协议编程接受似乎应该是可能的。允许子类使用子类代理

我有一个类A有它自己的委托ADelegate。 A本身会调用ADelegate的方法。

两个子类继承A:B和C. B有一些委托方法,只有它应该能够调用,所以它希望它自己的委托BDelegate继承ADelegate并添加了一些方法。同样,C想让它的委托成为CDelegate,继承ADelegate并添加一些方法。

最简洁的方式来构造这将给A属性var delegate: ADelegate。然后,不知何故,B和C分别获得属性override var delegate: BDelegateoverride var delegate: CDelegate。这样他们既可以使用ADelegate公开的方法,也可以使用自己的特定实现。但是,Swift不让我编译它,因为我无法重写一个属性并为其指定一个不同的类型。

我知道我可以在子类上创建一个不同的命名委托属性,所以没有冲突。我也知道,我可以让孩子班级代表,但这是一个昂贵的操作,并不是很干净。

感觉像他们应该是一个协议导向的方式来处理这个。总而言之,目标是允许子类覆盖具有更多特定类型的超类的属性。有任何想法吗?

回答

4

您希望A的子类具有子类特定的代表;你泛型实现这一点:

// 
// A Stuff 
// 
class ADelegate { 
    func doAnAThing() {} 
} 

class A<Delegate:ADelegate> { 
    var delegate : Delegate? 
} 

// 
// B Stuff 
// 
class BDelegate: ADelegate { 
    func doABThing() {} 
} 

class B : A<BDelegate> {  
} 

这与class例如适用于其它斯威夫特抽象的风格为好。