Swift的多重继承问题



我在Swift中遇到了多重继承的问题,这就是我的情况:

在我的应用程序中,我有各种UITableViewControllerUIViewController,但它们都必须有各种字段,例如一个数组和两个字符串。出于这个原因,我想创建一个超类'SuperClassTest',所有的UITableViewControllerUIViewController都继承自它,如下所示:

class SuperClassTest {
    var stringOne:String?
    var stringTwo:String?
}

我的问题是,例如,当我创建一个必须具有这些字段的UIViewController时,它不能从SuperClassTest继承,因为它已经从UIViewController类继承了。

如何解决此问题?

Swift和Objective-C只是单一继承,一个类不能有多个超类。

当你看到Swift代码的声明中有多个超类时,你会发现声明中最多有一个名称是超类,其他名称是协议的名称。

您不能在Objective C和Swift中实现多重继承。但是您可以通过多级继承来实现这一点。

class SuperClassViewController : UIViewController
{
    var stringOne:String?
    var stringTwo:String?
}
class YourViewController : SuperClassViewController
{
}

您将"超类"添加为协议:

Protocol SuperProtocolTest {
    var stringOne:String?
    var stringTwo:String?
}

然后,您可以使用您的协议作为您想要遵守的类的必要蓝图:

Class MyController : UITableViewController, SuperProtocolTest { 
    ...
}

Swift被认为是一种面向协议编程(POP)的语言,而不是OOP。你不能有多重继承,但你可以让你的一个类符合你想要的任意多个协议,例如

Class MyController : UITableViewController, SuperProtocolTest, UITextFieldDelegate, ... { 
    ...
}

如前所述:您只能继承一个类,但可以遵循任意多个协议。

显而易见的解决方案是创建一个包含所有所需vars并符合该协议的协议:

protocol ImportantPropertiesToHave {
    var stringOne : String? { get }
    var stringTwo : String? { get set }
}
class MyClass : UIViewController, ImportantPropertiesToHave {
    let stringOne : String? = "hi"
    var stringTwo : String? = nil
}

您必须在协议中指定它是只读变量还是读写变量。然后,您在实现中定义的变量必须至少符合该标准。

如果协议至少是get,那么您的实现可以选择将其作为公共变量。但是,如果协议希望它是get set,则您的实现不能使用let,而必须使用var

最新更新