【问题标题】:Can i able to support multiple inheritance with protocol in swift?我可以通过 swift 协议支持多重继承吗?
【发布时间】:2016-12-09 06:32:38
【问题描述】:

在 Swift 中,通过使用扩展,您可以在“协议”中提供方法主体。在我的代码中,我可以提供方法主体,请参阅

protocol Test1{
    func display()
}
extension Test1{

    func display(){
        print("display Test1")
    }
}

protocol Test2{
    func display()
}
extension Test2{

    func display(){
        print("display Test2")
    }
}
class ViewController: UIViewController,Test1,Test2 {

    var test1 : Test1?
    var test2 : Test2?

    func display() {
        print("display")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.test1 = self
        test1?.display()

        self.test2 = self
        test2?.display()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

我知道我在 ViewController 类中给出了 test1 和 test2 对象的地址。所以“显示”被打印了两次。但是在这两个“协议”中,我都可以使用这些方法。

所以我的问题是为什么苹果给了我在“协议”中编写方法主体的功能?

谁能帮我理解这个功能?

【问题讨论】:

    标签: ios swift swift3 protocols


    【解决方案1】:

    虽然这个问题看起来很简单,但解释了面向协议编程的所有方面以及 out 的重要性将使我围绕它写整个博客:)

    无论如何,面向协议编程基本上使您能够利用诸如 JAVA、Objective-C 等面向对象编程语言不支持的多重继承,因为DiamondProblem

    现在虽然面向协议的编程允许您对能力进行建模 /functionality 作为协议而不是类的实例方法(如在 Objective C 的情况下)我们必须同意我们总是喜欢继承!!,记住你曾经用一些操作声明一个方法,然后扩展它写任何特定的到孩子并且仍然通过调用 super.methodname 来使用父方法中的所有代码???现在你怎么可能在协议中实现它???不能重复使用代码??

    因此,Protocols 默认实现是向类提供默认实现的简单方法,它只是想扩展和确认协议,而不是费心修改它。

    示例:假设我有一个打印我的姓氏的协议,如果父类确认它,如果我也确认相同的协议,它将打印与我相同的姓氏:) 正确的毕竟它的姓氏它不会'不改!!!

    仅仅因为你确认了一个协议,如果协议已经有自己的默认实现,你就不需要提供它的方法实现。如果您想要做的不是提供的默认实现,您将提供自己的:)

    protocol Test {
        func test1()
    }
    
    extension Test {
        func test1() {
            print("Yo man")
        }
    }
    
    protocol Test2 {
        func test2()
    }
    
    extension Test2 {
        func test2() {
            print("Bye man")
        }
    }
    
    class ViewController: UIViewController,Test,Test2 {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            self.test1()
            self.test2()
        }
    }
    

    如您所见,我没有为 test1 或 test2 提供任何实现,但我使用它就好像它已经为我实现了一样:)

    这就是协议默认实现的意图。希望对你有帮助

    观察:

    你有两个协议,Test1 和 Test2 都有相同的方法 display,现在你进入 DiamondProblem 的基本问题,如果我简单地调用 display() 调用哪个实现? Test1 还是 Test2 的 ?? Swift 在编译时解决它,并告诉你调用 self.display() 时对 display() 的模棱两可使用

    它仍然可以在您的代码中工作的唯一原因可能是因为您创建了两个类型为 test1 和 test2 的变量,并且您已经使用 test1.display() 和 test2.display() 调用了方法,这没有歧义,但仅此而已不是你想怎么使用它不是吗??

    所以基本上你永远不会陷入协议的钻石问题:)

    【讨论】:

    • 如果协议 Test 和 Test2 具有相同的签名方法 "display()" ,并且您像 self.display() 那样调用,那么将调用哪个协议方法?
    • @vikas-prajapati :如果我的回答澄清了您的疑问,请考虑接受答案
    • @vikas-prajapati : 谢谢好友 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多