【问题标题】:A way to inherit from multiple classes一种从多个类继承的方法
【发布时间】:2016-01-28 09:52:51
【问题描述】:

我有两个课程要在我的新课程中使用。第一个实现滑动删除,第二个实现长按手势:

class DeleteItem: UITableViewCell {
}

class OpenDetail: UITableViewCell {
}

由于 Swift 不允许一个类从多个类继承,下面的例子显然是行不通的:

class ItemViewCell: DeleteItem, OpenDetail {
}

因此,为了创建 ItemViewCell 并同时拥有这两个选项,我必须让其中一个类相互继承:

class DeleteItem: UITableViewCell {
}

class OpenDetail: DeleteItem {
}

class ItemViewCell: OpenDetail {
}

问题是,如果我只想要长按手势,我将不得不创建一个新类,而不是从DeleteItem 继承。有更好的方法吗?

【问题讨论】:

  • Yes.
  • @JanGreve:您介意向我展示一个如何使用扩展实现此目的的示例吗?在我的项目中,它给了我一个错误。
  • 你不能制作DeleteItemOpenDetail 协议,而不是类吗?
  • 唯一的解决方案是子类OpenDetail添加滑动实现或子类DeleteItem添加长按。这两个类可能都覆盖了相同的方法(例如awakeFromNib)。
  • 我不确定我对protocol 的理解是否正确,但协议不是“简单地”对象必须遵守的吗?即:协议中声明的变量/函数在对象中应该是强制性的,以使其符合协议。在那种情况下,我不知道如何使DeleteItemOpenDetail 成为协议,因为它远比这复杂。简单来说,DeleteOpen 主要是关于手势识别和这个手势的处理(移动表格视图单元格等)。

标签: swift class inheritance


【解决方案1】:

这是使用协议和协议扩展的完美案例。例如,一个 swift protocol 就像 Java 中的一个接口。协议可以定义一组功能,这些功能必须由想要遵守该协议的实体实现,此外,协议还可以定义这些实体中必须存在的属性。例如:

protocol ItemDeleter {
  var deletedCount: Int {get set}
  func deleteItem(item: ItemType)
}

问题是,每个实体都必须提供自己的func deleteItem(item: ItemType) 实现,即使多个实体共享删除项目的相同逻辑,此时协议扩展就派上用场了。例如:

extension ItemDeleter {
  func deleteItem(item: ItemType) {
    // logic needed to delete an item

    // maybe incremented deletedCount too
    deletedCount++
  }
}

然后你可以让你的ItemViewCell 符合ItemDeleter 协议,在这种情况下你只需要确保ItemViewCell 有一个属性deletedCount: Int。它不需要为func deleteItem(item: ItemType) 提供实现,因为协议本身为此函数提供了默认实现,但是您可以在您的类中覆盖它,并且将使用新的实现。这同样适用于DetailOpener protocol

【讨论】:

  • 不,协议不能给你多重继承。尤其是当两个实现都试图覆盖相同的方法时。
  • @Sulthan,协议可以让您一窥多重继承。如果在 2 个不同的协议中需要相同方法的 2 个默认实现,编译器会抱怨您不符合您最后遵守的协议,并要求您为函数提供自己的实现以符合这两种协议.我相信这里的子类化不是一个好的设计。
  • 问题是协议不适合这种确切的情况。它根本行不通。
  • @Sulthan 我认为协议适合这种情况。我看不出在这里使用协议有什么问题,协议引起的损害的一个例子很容易详细说明。
  • 这里的关键问题是不能将功能分离为两个独立的组件(协议),组件需要相互了解。这是核心问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2015-09-19
相关资源
最近更新 更多