class 继承的好处,什么时候可以使用协议扩展?
Benefit of class inheritance, when you could use protocol extensions?
我着迷于使用 协议扩展 编写漂亮代码的可能性。
但我似乎没有掌握 class 继承之间的真正区别。
我知道有不同的方法来建模某些东西,比如我可以使用组合而不是 class 继承。
但是后来我知道了class继承的特点,subclass可以很容易地使用superclass的实现。通过协议扩展,我也有这个功能,即使对于值类型也是如此。
所以问题是 class 继承有哪些特性,协议扩展没有;或者何时使用 class 继承而不是协议扩展。
class 继承的"benefit" 是您可以继承存储的属性和初始化器,它们也可以从子class 获得默认实现。
但至少对我来说这些只是小小的好处。
如果不是Cocoa,可能就没有了。
一种过于简化的表达方式是"when you're working with protocols, use extensions, and when you're dealing with Objects, use subclassing"。
为了不那么简单,当你在 Swift 中编程时,你将不得不处理 Cocoa,而当你处理 Cocoa,你将不得不处理对象。当你必须处理对象时,有时最好的方法是 subclassing.
以UIViewController
为例,我们都必须考虑到这一点。据我所知,没有 UIViewControllerProtocol
。这意味着 UIViewController
有很多你不能通过声明符合协议来重新实现的内置行为。如果您希望您的应用程序的主要 UIViewController
具有自定义功能——我们都这样做——您必须对其进行子class。然后通过继承获得所有这些行为。
我想另一种说法是,在您别无选择只能处理没有协议设计的对象的情况下,class 继承优于协议扩展。
对于我们 Swift 人来说,这经常发生。
我发现的唯一真正好处是您可以创建 superclass 对象,它不是 subclass,因此您可以忽略 subclass 的任何实现细节。
如果A是B的超class。那么你可以创建A而不必关心B的任何东西。
对于协议,您始终必须使用采用 struct/class。
在某些情况下,创建 UIResponder 而不是 UIViewController 是有意义的,因为您不想要该功能,并且只使用 class 和 less 特征。
仅使用协议及其扩展,您必须选择一种实现,因此为了避免两次编写相同的代码,必须有多个协议,一个用于相应 class 层次结构的每个层次结构级别。
如果 P2 采用 P1 并且 P1E 是 P1 的扩展而 P2E 是 P2 的扩展,那么您必须创建一个采用 P1 的 struct/class 来获得功能较弱的 [=24 版本=]采用P2.
我着迷于使用 协议扩展 编写漂亮代码的可能性。 但我似乎没有掌握 class 继承之间的真正区别。
我知道有不同的方法来建模某些东西,比如我可以使用组合而不是 class 继承。
但是后来我知道了class继承的特点,subclass可以很容易地使用superclass的实现。通过协议扩展,我也有这个功能,即使对于值类型也是如此。
所以问题是 class 继承有哪些特性,协议扩展没有;或者何时使用 class 继承而不是协议扩展。
class 继承的"benefit" 是您可以继承存储的属性和初始化器,它们也可以从子class 获得默认实现。
但至少对我来说这些只是小小的好处。
如果不是Cocoa,可能就没有了。
一种过于简化的表达方式是"when you're working with protocols, use extensions, and when you're dealing with Objects, use subclassing"。
为了不那么简单,当你在 Swift 中编程时,你将不得不处理 Cocoa,而当你处理 Cocoa,你将不得不处理对象。当你必须处理对象时,有时最好的方法是 subclassing.
以UIViewController
为例,我们都必须考虑到这一点。据我所知,没有 UIViewControllerProtocol
。这意味着 UIViewController
有很多你不能通过声明符合协议来重新实现的内置行为。如果您希望您的应用程序的主要 UIViewController
具有自定义功能——我们都这样做——您必须对其进行子class。然后通过继承获得所有这些行为。
我想另一种说法是,在您别无选择只能处理没有协议设计的对象的情况下,class 继承优于协议扩展。
对于我们 Swift 人来说,这经常发生。
我发现的唯一真正好处是您可以创建 superclass 对象,它不是 subclass,因此您可以忽略 subclass 的任何实现细节。
如果A是B的超class。那么你可以创建A而不必关心B的任何东西。
对于协议,您始终必须使用采用 struct/class。
在某些情况下,创建 UIResponder 而不是 UIViewController 是有意义的,因为您不想要该功能,并且只使用 class 和 less 特征。
仅使用协议及其扩展,您必须选择一种实现,因此为了避免两次编写相同的代码,必须有多个协议,一个用于相应 class 层次结构的每个层次结构级别。
如果 P2 采用 P1 并且 P1E 是 P1 的扩展而 P2E 是 P2 的扩展,那么您必须创建一个采用 P1 的 struct/class 来获得功能较弱的 [=24 版本=]采用P2.