zoukankan      html  css  js  c++  java
  • swift protocol 与类继承结合时的bug

    protocol CommonTrait: class {

        func commonBehavior() -> String

    }

    extension CommonTrait {

        func commonBehavior() -> String {

            return "from protocol extension"

        }

    }

    class CommonThing {

        func say() -> String {

            return "override this"

        }

    }

    class ParentClass: CommonThing, CommonTrait {

        override func say() -> String {

            return commonBehavior()

        }

    }

    class AnotherParentClass: CommonThing, CommonTrait {

        override func say() -> String {

            return commonBehavior()

        }

    }

    class ChildClass: ParentClass {

        override func say() -> String {

            return super.say()

            // it works if it calls `commonBehavior` here and not call `super.say()`, but I don't want to do that as there are things in the base class I don't want to have to duplicate here.

        }

        func commonBehavior() -> String {

            return "from child class"

        }

    }

    let child = ChildClass()

    child.say() // want to see "from child class" but it's "from protocol extension”

    实现链条缺失时会使用protocol的缺省实现。不能路由到真正的实现。

    https://stackoverflow.com/questions/31795158/swift-2-protocol-extension-not-calling-overridden-method-correctly

    Unfortunately protocols don't have such an dynamic behavior (yet).

    But you can do that (with the help of classes) by implementing commonBehavior() in the ParentClass and overriding it in the ChildClass. You also need CommonThing or another class to conform to CommonTrait which is then the superclass of ParentClass:

  • 相关阅读:
    存储过程拆分字符窜
    jquery学习
    Sql常用语法
    存储过程分页
    asp.net 定时执行程序
    C# 多线程并发处理数据库数据,发送信号等待处理完统一插入.(转)
    (转)CAS 单点登录安装笔记4
    C# 自动退出当前程序,然后再启动
    给自己的Web文件夹增加一个图片或其它文件认证
    Setting NTFS Permissions with C#
  • 原文地址:https://www.cnblogs.com/feng9exe/p/9459963.html
Copyright © 2011-2022 走看看