【问题标题】:Allowing a subclass to use a subclassed delegate允许子类使用子类委托
【发布时间】:2015-06-27 21:48:45
【问题描述】:

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

我知道我可以在子类上创建一个不同的命名委托属性,这样就不会发生冲突。我也知道我可以让子类投射委托,但这是一项昂贵的操作,而且不是很干净。

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

【问题讨论】:

    标签: ios swift oop inheritance protocols


    【解决方案1】:

    您希望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 抽象样式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多