Swift 不支持多重继承,如何实现?



以下代码:

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?
}

生成编译时错误:

地址.swift:38:24:从类"城市"和"城镇"的多重继承

我怎样才能解决他的那种问题?遵循什么方法?

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

class Address { 
var city: City?
var town: Town?
var house : String?
var street: String?
}

备注:如果您不确定继承是否适合您的情况,我建议您查看 Sulthan 的答案。

但是,正如你提到的,Swift不支持多重继承。相反,您应该做的是让Address类采用协议;您还可以添加协议扩展

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

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

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

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!!

更进一步:

有关详细信息,请查看协议和扩展文档。

此外,您可能想在 Swift Apple Session 中观看面向协议的编程。

最新更新