【问题标题】:Benefit of class inheritance, when you could use protocol extensions?类继承的好处,什么时候可以使用协议扩展?
【发布时间】:2015-06-14 10:49:12
【问题描述】:

我对带有协议扩展的漂亮代码的可能性着迷。 但我似乎没有掌握类继承之间的真正区别。

我知道有不同的方法来建模某些东西,比如我可以使用组合而不是类继承。

但后来我知道了类继承的特点,就是子类可以很容易地使用超类的实现。有了协议扩展,我也有这个特性,即使是值类型。

所以问题是类继承有哪些特性,哪些协议扩展没有;或何时使用类继承而不是协议扩展。

【问题讨论】:

  • 这不是一个直接的答案,而是一个理论上的答案,但我在某处表示你应该使用类继承,当 sublcas IS超类的实例,并在您的类具有协议的属性时使用协议。
  • 这听起来更像是继承与组合的区别。

标签: protocols swift2


【解决方案1】:

类继承的“好处”是您可以继承存储的属性和初始化程序,它们也可以从子类中获得默认实现。

但至少对我来说,这些只是微不足道的好处。

【讨论】:

  • 附注:您可以在 Swift 扩展中添加便利初始化程序,而不是指定初始化程序。
【解决方案2】:

如果不是 Cocoa,可能就没有。

一个过于简单的说法是“当你使用协议时,使用扩展,当你处理对象时,使用子类化”。

为了不那么简单,当您使用 Swift 编程时,您将不得不处理 Cocoa,而当您处理 Cocoa 时,您将不得不处理对象。而当您必须处理对象时,有时最好的方法是子类化。

UIViewController 为例,我们都必须考虑到这一点。据我所知,没有UIViewControllerProtocol。这意味着UIViewController 有很多固有的行为,你不能仅仅通过声明符合协议来重新实现这些行为。如果您希望您的应用程序的主要 UIViewController 具有自定义功能 - 我们都这样做 - 您必须对其进行子类化。然后您通过继承获得所有这些行为。

我想另一种说法是,当您别无选择只能处理设计为没有协议的对象时,类继承优于协议扩展。

对于我们 Swift 的人来说,这经常发生。

【讨论】:

  • Rhis 固有的行为不需要再次实施。协议扩展确实有它们的实现。那是关于协议的新事物,在协议本身中完全实现了功能。所以不,我不明白为什么我应该使用子类化,你也没有举例说明我为什么应该这样做。
  • @ViktorLexington,我想轻轻询问一下您是否经常使用UIViewController--我相信,如果您使用过,您就会理解该示例的适用性。如果你还没有,请理解,你说的是抽象的,比较两个假设的类,每个类都以不同的方式实现相同的功能。在那种情况下,你是对的。但这就是为什么我说“如果不是可可,可能没有”。 Cocoa大部分是没有相应协议的类,因此没有访问(或在某些情况下甚至创建)默认协议扩展的路径。
【解决方案3】:

我发现唯一真正的好处是您可以创建超类对象,它们不是子类,因此您可以忽略子类的任何实现细节。

如果 A 是 B 的超类。那么您可以创建 A 而不必关心 B 的任何内容。

对于协议,您总是必须使用采用的结构/类。

在某些情况下,创建 UIResponder 而不是 UIViewController 是有意义的,因为您不想要该功能,并且只使用具有 less 功能的类更安全、更容易。

仅使用协议及其扩展,您必须选择一种实现,因此为了不两次编写相同的代码,必须有多个协议,一个用于相应类层次结构的每个层次结构级别。

如果 P2 采用 P1,P1E 是 P1 的扩展,P2E 是 P2 的扩展,那么您必须创建一个采用 P1 的结构/类,以便获得一个采用 P2 的结构/类的功能较弱的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多