【问题标题】:multiple inheritance issue Swift多重继承问题Swift
【发布时间】:2015-12-31 12:01:53
【问题描述】:

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

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

class SuperClassTest {

    var stringOne:String?
    var stringTwo:String?
}

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

我该如何解决这个问题?

【问题讨论】:

  • 您的问题标题非常具有误导性。 Swift 不支持多重继承
  • ... 和 UITableViewController 无论如何都继承自 UIViewController
  • @SahebRoy 有什么误导性?
  • "多重继承问题 Swift" 当 swift 不支持多重继承时。这不是误导吗?
  • 不,这是 OP 的一个明显错误,我们可以轻松解决。问题是他想要“多重继承”,但不知道如何靠自己实现。

标签: ios swift inheritance uiviewcontroller


【解决方案1】:

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

当您看到声明中包含多个超类的 Swift 代码时,您最多会看到声明中的一个名称是超类,其他名称是协议的名称。

【讨论】:

  • 我知道,我的问题是如何解决无法使用多重继承的问题
【解决方案2】:

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

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

class YourViewController : SuperClassViewController
{
}

【讨论】:

  • 我的问题是我有很多类必须具有这些字段,例如 uiviewcontroller 、 uitableviewcontroller 等。这样,我必须为每个类替换这些字段
【解决方案3】:

您将“超类”添加为协议:

Protocol SuperProtocolTest {

    var stringOne:String?
    var stringTwo:String?
}

然后,您可以将您的协议用作您想要符合它的类的必要蓝图:

Class MyController : UITableViewController, SuperProtocolTest { 
    ...
}

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

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

【讨论】:

    【解决方案4】:

    如前所述:您只能继承一个类,但可以根据需要遵循任意数量的协议。

    显而易见的解决方案是创建一个包含所有必需变量的协议并遵守该协议:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-08
      • 2021-05-08
      • 1970-01-01
      • 2019-04-14
      • 2013-04-24
      • 2020-07-24
      • 1970-01-01
      相关资源
      最近更新 更多