微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 我可以在swift中使用协议支持多重继承吗?

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对象的地址.所以“显示”被打印两次.但在“协议”中,我能够使用这些方法.

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

任何人都可以帮我理解这个功能吗?

解决方法

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

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

现在虽然面向协议编程允许您对功能进行建模
/作为一个协议的功能而不是作为类的实例方法(如在Objective C的情况下)我们必须同意我们都喜欢继承!!,记住你曾经用一些操作声明一个方法,然后扩展它写任何特定的to child并仍然使用parent方法中的所有代码只需调用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都有相同的方法显示,现在你进入DiamondProblem的基本问题,如果我只是调用display()调用哪个实现? Test1或Test2’s ?? Swift在编译时解决它并告诉你在调用self.display()时模糊地使用display()

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐