【问题标题】:Work around multiple inheritance解决多重继承问题
【发布时间】:2014-11-05 19:18:18
【问题描述】:

我基本上有两个视图控制器。他们都将与另一个控制器/经理一起工作。我希望这个管理器对两个控制器完全相同。所以两个控制器都应该引用同一个管理器/控制器。还有一个使用管理器的第三个类。

起初我以为我可以将管理器/控制器继承到两个视图控制器。但 Swift 不允许这样做。那么,我究竟如何才能实现这个想法呢?

所有这一切都是交易:

我有这四个类:

FirstViewController(继承 UIViewController)

SecondViewController(继承 UIVIewController)

EventController(什么都不继承 - 还没有)

MapManager(不继承任何内容)

firstviewcontroller、secondviewcontroller和MapManager需要用到EventController中的函数/属性。

我现在拥有的:

首先,SecondViewcontrollers 和 MapManager 继承自 UIViewController 类型的 EventController。然而,在地图管理器类中,EventController 的属性无法正常工作(例如:填充数组为空)

【问题讨论】:

    标签: inheritance swift


    【解决方案1】:

    如果您有 2 个或更多 UIViewController(或类似)具有共同行为,您可以创建一个基类 BaseViewController,继承自 UIViewController,然后让您的专用视图控制器继承自它

            UIViewController
                   |
           BaseViewController
             |           | 
    ViewController1 ViewController2
    

    如果方程式中涉及另一个类,则此解决方案不起作用。与许多现代语言一样,Swift 仅支持单继承。

    为简单起见,我们将附加类称为“经理”。我看到了 3 种替代解决方案:

    1. 在基本视图控制器中创建管理器的实例(作为属性),并通过包装方法公开其接口(即为管理器创建协议,在基本视图控制器中实现它,实现简单将请求转发到管理器实例)

    2. 在基本视图控制器中创建一个管理器实例(作为属性),并使其可供子类访问

    3. 摆脱管理器类并将其代码合并到基本视图控制器中

    此列表当然并非详尽无遗。论点过于宽泛,无法给出有针对性的建议,而且没有适用于所有情况的解决方案。

    【讨论】:

    • 感谢您的回复。我忘了提到还有另一个类(NSObject 类型)使用管理器(在您的示例中为 baseviewcontroller)。如何执行这样的层次结构?
    • 这彻底改变了事情......用一些建议更新了答案,我不能更具体,因为一个好的解决方案需要对现有代码及其架构有更多的了解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多