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

2 oop inheritance multiple-inheritance 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?

}
Run Code Online (Sandbox Code Playgroud)

生成编译时错误:

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

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

Sul*_*han 6

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

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

    var house : String?
    var street: String?
}
Run Code Online (Sandbox Code Playgroud)


Ahm*_*d F 5

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

但是,正如你提到的,雨燕并没有支持多重继承。你应该做的是让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 {}
Run Code Online (Sandbox Code Playgroud)

输出:

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!!
Run Code Online (Sandbox Code Playgroud)

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

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

输出:

let address2 = Address()
address2.doSomething()
// Do Something!!
// Addtional Job!!
Run Code Online (Sandbox Code Playgroud)

更进一步:

有关更多信息,请查看协议扩展文档。

此外,您可能想观看Swift Apple Session 中的 Protocol-Oriented Programming