【问题标题】:Swift does not support multiple inheritance, How could be achieved?Swift不支持多重继承,怎么可能实现呢?
【发布时间】:2017-08-22 12:43:02
【问题描述】:

以下代码:

class City {
    var cityId : String?
    var cityName : String?
}

class Town {
    var townid : String?
    var townName : String?

}

class Address : City , Town {

    var house : String?
    var street: String?

}

生成编译时错误:

Address.swift:38:24:来自“City”和“Town”类的多重继承

我该如何解决他的问题?遵循什么方法?

【问题讨论】:

  • 使用自定义协议
  • 这里多重继承的目的是什么,你可以在多级情况下访问超类成员。
  • 嗯,这里显然 city 可以从 Town 派生,即 City: Town。并且应该有一个协议,比如说 IdSupportable { id: String {get}; name: String {get}} 然后 Town 实现了 IdSupportable,Address 实现了相同的协议。但地址不是城市或城镇。

标签: swift oop inheritance multiple-inheritance


【解决方案1】:

看来你想多了。尝试使用更多组合,而不是继承。地址不应继承自 City。为什么?因为从逻辑上讲,地址不是一种城市。相反,城市定义是地址的一部分:

class Address { 
    var city: City?
    var town: Town?

    var house : String?
    var street: String?
}

【讨论】:

    【解决方案2】:

    备注:如果您不确定继承是否适合您的情况,我建议检查Sulthan's answer

    然而,正如你所提到的,Swift 确实支持多重继承。你应该做的是让Address 类采用protocols;您还可以添加协议扩展

    您可以扩展现有类型以采用并符合新的类型 协议,即使您无权访问 现有类型。扩展可以添加新的属性、方法和 现有类型的下标,因此能够添加任何 协议可能要求的要求。

    意味着您可以为协议方法/属性实现默认值/行为。

    参考您的示例,它应该类似于:

    protocol City { }
    
    extension City {
        var cityId: String {
            return "Default City ID"
        }
    
        var cityName: String {
            return "Default City Name"
        }
    
        // adding method:
        func doSomething() {
            print("Do Something!!")
        }
    }
    
    protocol Town { }
    
    extension Town {
        var townid: String {
            return "Default Town ID"
        }
    
        var townName: String {
            return "Default Town Name"
        }
    }
    
    class Address:City, Town {}
    

    输出:

    let address = Address()
    
    print(address.cityId) // Defaut City ID
    print(address.cityName) // Defaut City Name
    print(address.townid) // Default Town ID
    print(address.townName) // Default Town Name
    
    address.doSomething() // Do Something!!
    

    另外,如果你想在方法中添加一些额外的工作(类似于super.doSomething()),你可以这样做:

    class Address:City, Town {
        func doSomething() {
            (self as City).doSomething()
            print("Addtional Job!!")
        }
    }
    

    输出:

    let address2 = Address()
    address2.doSomething()
    // Do Something!!
    // Addtional Job!!
    

    更进一步:

    有关更多信息,请查看 ProtocolsExtensions 文档。

    另外,您可能想观看Protocol-Oriented Programming in Swift Apple Session

    【讨论】:

    • 是的,解决了我的问题! 'City' 和 'Town' 类的多重继承感谢您的回复
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2011-02-21
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多