允许子类使用子类委托

时间:2015-06-27 21:48:46

标签: ios swift oop inheritance protocols

我正在尝试为Swift中的问题实现一个干净的OOP结构。似乎应该可以使用Swift 1.2和Apple新推出的面向协议编程。

我有一个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不允许我编译它,因为我无法覆盖属性并为其分配不同的类型。

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

感觉就像他们应该是一种面向协议的处理方法。总而言之,目标是允许子类覆盖具有更多特定类型的超类的属性。有什么想法吗?

1 个答案:

答案 0 :(得分: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示例也适用于其他Swift抽象样式。