类是否可以在协议扩展上显式调用方法?

咕cake蛋糕

假设存在以下协议,并且扩展提供了someFuncWithDefaultImplementation()的默认实现。

那么MyClass2是否有可能同时提供someFuncWithDefaultImplementation()的自身实现,该实现也从扩展中调用该方法的默认实现?

protocol MyProtocol : class {
    func someFuncWithDefaultImplementation()
    func someFunc()
    var  someInt:Int { get set }
}

extension MyProtocol {
    func someFuncWithDefaultImplementation() {
        someInt = 5
    }

    func someFunc() {
        someFuncWithDefaultImplementation()
    }
}

class MyClass :  MyProtocol {
    var someInt = 6
}

class MyClass2 : MyProtocol
{
    var someInt: Int = 4
    func someFuncWithDefaultImplementation()
    {
        // do some additional stuff
         /*** someFuncWithDefaultImplementation()  invoke MyProtocol extension implementation here ***/
    }
}


    let class1 = MyClass()
    class1.someFunc()

    let class2 = MyClass2()
    class2.someFunc()
dfrib

线程中以下答案

描述了使用嵌套虚拟类型从已经提供了自己的蓝图方法实现的类型中访问协议的默认实现。我们可以扩展此方法,使其也允许实际使用MyClass2实例的(蓝图)属性,但是在对MyClass2已实现其自定义版本的默认实现的调用内(因此优先于默认值)。

我们首先查看示例的轻量级版本,并为该示例提供默认实现 someFuncWithDefaultImplementation()

protocol MyProtocol : class {
    func someFuncWithDefaultImplementation()
    var someInt: Int { get set }
}

extension MyProtocol {
    func someFuncWithDefaultImplementation() {
        print("Called default impl. Currently, someInt = \(someInt)")
        print("Mutates someInt from within default implementation (0) ...")
        someInt = 0
    }
}

我们使用非优雅的嵌套式解决方案的定制实现someFuncWithDefaultImplementation()MyClass2,调用后者的默认实现,但存储在参考Dummy实例回MyClass2实例,以使someInt财产MyClass2在默认实现通话使用(用于读写),即使这是从Dummy类型中调用的也是如此

class MyClass2 : MyProtocol
{
    var someInt: Int = 42

    func someFuncWithDefaultImplementation()
    {
        // do some additional stuff ...
        print("In MyClass2 implementation, currently someInt = \(someInt)")

        /* Dummy 'MyClass2'-capturing type used to call the default
            implementation of 'MyProtocol', but with read and write 
            access to 'MyClass2':s self:s 'someInt' instance. */
        class Dummy : MyProtocol {
            unowned let myClass2: MyClass2
            init(_ myClass2: MyClass2) { self.myClass2 = myClass2 }
            var someInt: Int {
                get { return myClass2.someInt }
                set { myClass2.someInt = newValue }
            }
        }

        // call default implementation of 'someFuncWithDefaultImplementation'
        // supplying 'self' to read/write access to self.someInt.
        Dummy(self).someFuncWithDefaultImplementation()

        print("Back in MyClass2:s implementation; now someInt = \(someInt)") 
           // 0, woah, mutated in default implementation!
    }
}

let a = MyClass2()
a.someFuncWithDefaultImplementation()
/* In MyClass2 implementation, currently someInt = 42
   Called default impl. Currently, someInt = 42
   Mutates someInt from within default implementation (0) ...
   Back in MyClass2:s implementation; now someInt = 0         */

您也可以选择Dummy在函数外部声明嵌套,仅对其private进行标记以确保不能从外部访问它MyClass2

class MyClass2 : MyProtocol
{
    var someInt: Int = 42

    /* Dummy 'MyClass2'-capturing type used to call the default
       implementation of 'MyProtocol', but with read and write 
       access to 'MyClass2':s self:s 'someInt' instance. */
    private class Dummy : MyProtocol {
        unowned let myClass2: MyClass2
        init(_ myClass2: MyClass2) { self.myClass2 = myClass2 }
        var someInt: Int {
            get { return myClass2.someInt }
            set { myClass2.someInt = newValue }
        }
    }

    func someFuncWithDefaultImplementation()
    {
        // do some additional stuff ...
        print("In MyClass2 implementation, currently someInt = \(someInt)")

        // call default implementation of 'someFuncWithDefaultImplementation'
        // supplying 'self' to read/write access to self.someInt.
        Dummy(self).someFuncWithDefaultImplementation()

        print("Back in MyClass2:s implementation; now someInt = \(someInt)") 
           // 0, woah, mutated in default implementation!
    }
}

但是,我将重复与链接答案的作者相同的方法:这种方法不是很好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在没有显式引用的方法上调用扩展方法

是否可以显式调用名称错误的函数?

在隐式类上扩展AnyVal是否可以提高性能?

是否有必要在python中的自定义迭代器类上显式调用iter()?

Java:如何显式调用方法的自己的类版本?

快速调用静态方法:type(of:self)与显式类名

Java-泛型类的显式方法调用?

是否可以使用Ninject注入显式实现的方法?

如果协议扩展中定义了静态方法,如何调用协议上的静态方法?

即使没有直接调用“ if”,它们是否也可以隐式访问类的特殊方法?

是否可以在扩展的scala类中扩展方法?

是否可以从匿名类调用多个方法?

显式调用extJS类的initComponent

是否显式调用return函数

您可以在Kotlin中使用接口委托时显式调用父类吗?

为什么不能使用显式泛型参数调用泛型扩展方法?

如果类显式扩展Object,为什么不能调用方法?

是否可以在PHPDoc的调用方中为参数指定显式类型

是否可以调用显式指定模板参数的模板化强制转换运算符?

是否可以调用具有显式特化的模板化 lambda?

斯威夫特:是否可以在协议中添加协议扩展?

是否可以对具有显式实现的接口属性的类进行json序列化?

您可以显式地使用祖先的虚拟类方法作为派生方法吗?

是否可以创建在创建对象时调用的扩展方法?

C++11:我可以显式调用基类析构函数来销毁派生类吗?

如何在不指定类的情况下使用显式类型参数调用Java方法?

如何在C#中的基类上调用显式接口方法?

显式调用Java中的默认方法

是否需要显式调用system.loadLibrary来访问NativeActivity子类中的本机方法?