4

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

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

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

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

4

3 回答 3

1

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

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

于 2015-06-17T21:51:30.700 回答
1

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

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

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

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

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

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

于 2015-10-13T17:26:38.543 回答
0

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

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

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

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

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

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

于 2016-06-29T12:53:33.860 回答