我对使用协议扩展的漂亮代码的可能性着迷。 但我似乎并未掌握类继承之间的真正区别。
我知道有不同的方法来建模,比如我可以使用合成而不是类继承。
但后来我知道了类继承的特性,那就是子类可以非常容易地使用超类的实现。通过协议扩展,我也有这个功能,即使对于值类型也是如此。
所以问题是类继承有哪些特性,哪些协议扩展没有;或何时使用类继承而不是协议扩展。
答案 0 :(得分:1)
类继承的“好处”是你可以继承存储的属性和初始化器,它们也可以从子类中获得默认实现。
但至少对我来说这些只是微不足道的好处。
答案 1 :(得分:1)
如果不是Cocoa,可能没有。
过度简化的方式是#34;当您使用协议,使用扩展程序时,以及当您处理对象时,请使用子类化"。
不那么简单,当你在Swift中编程时,你将不得不处理Cocoa,而当你处理Cocoa时,你就会去必须处理对象。当你必须处理对象时,有时候最好的做法就是进行子类化。
拿UIViewController
,我们都必须考虑到这一点。据我所知,没有UIViewControllerProtocol
。这意味着UIViewController
具有许多烘焙行为,您无法通过声明符合协议来重新实现这些行为。如果您希望应用程序的主要UIViewController
具有自定义功能 - 我们都这样做 - 您必须将其子类化。然后,您通过继承获得所有行为。
我想另一种说法是,在你没有选择而只处理没有协议设计的对象的情况下,类继承优于协议扩展。
对我们来说,对于我们来说,Swift人经常会这样。
答案 2 :(得分:0)
我发现的唯一真正的好处是你可以创建超类对象,它们不是子类,所以你可以忽略子类的任何实现细节。
如果A是B的超类,那么你可以创建A并且不必关心B中的任何内容。
使用协议,您总是必须使用采用struct / class。
在某些情况下,创建UIResponder而不是UIViewController是有意义的,因为您不需要该功能,只使用具有较少功能的类更安全,更容易。
仅使用协议及其扩展,您必须选择一个实现,因此,为了不再编写两次相同的代码,必须有多个协议,一个用于相应类层次结构的每个层次结构级别。
如果P2采用P1而P1E是P1的扩展而P2E是P2的扩展,则必须创建一个仅采用P1的结构/类来获得采用P2的结构/类的能力较弱的版本。