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

Swift不支持多重继承,如何实现?,swift,oop,inheritance,multiple-inheritance,Swift,Oop,Inheritance,Multiple Inheritance,以下代码: 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:

以下代码:

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和Town类的多重继承

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

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

但是,正如您所提到的,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!!
let address2 = Address()
address2.doSomething()
// Do Something!!
// Addtional Job!!
此外,如果要向方法添加一些附加作业(类似于
super.doSomething()
),可以这样做:

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

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!!
let address2 = Address()
address2.doSomething()
// Do Something!!
// Addtional Job!!

更进一步:

有关更多信息,请查看和记录


另外,你可能想看。

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

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

    var house : String?
    var street: String?
}

使用自定义协议多重继承的目的是什么,您可以在多级情况下访问超类成员。呃,这里显然可以从Town派生city,即city:Town。应该有一个协议,比如IdSupportable{id:String{get};name:String{get}},然后Town实现IdSupportable,Address实现相同的协议。但地址不是一个城市,也不是一个城镇。yea的可能副本解决了我的问题!“City”和“Town”类的多重继承感谢您的回复