我对带有协议扩展的漂亮代码的可能性很感兴趣。但我似乎并不理解阶级继承之间的真正区别。
我知道有不同的建模方法,比如我可以使用组合而不是类继承。
但是我知道了类继承的特性,即子类可以非常容易地使用超类的实现。通过协议扩展,我也有这个特性,甚至对于值类型也是如此。
因此,问题在于类继承具有哪些特性,哪些协议扩展没有;或者何时使用类继承而不是协议扩展。
发布于 2016-06-29 04:53:33
我发现的唯一真正好处是您可以创建超类对象,这些对象不是子类,因此您可以忽略子类的任何实现细节。
如果A是B的超类,那么您可以创建A,而不必关心B中的任何内容。
对于协议,您总是必须使用采用的struct/class。
在某些情况下,创建一个UIResponder而不是一个UIViewController是有意义的,因为您不需要这种功能,而且只使用具有更少特性的类更安全、更容易。
如果只使用协议及其扩展,则必须选择一个实现,因此,要避免两次编写相同的代码,就必须有多个协议,对应的类层次结构的每个层次都有一个协议。
如果P2采用P1,而P1E是对P1的扩展,而P2E是P2的扩展,那么必须创建一个采用P1的结构/类,这样才能得到采用P2的结构/类的能力较低的版本。
发布于 2015-06-17 13:51:30
类继承的“好处”是您可以继承存储的属性和初始化器,这些属性和初始化器也可以从子类继承默认实现。
但这些只是一点点好处,至少对我来说是这样。
发布于 2015-10-13 09:26:38
如果不是可可,可能就没有了。
一种过于简化的方法是“在处理协议、使用扩展和处理对象时,使用子类”。
更简单的是,当你用Swift编程的时候,你必须处理Cocoa,当你处理Cocoa的时候,你必须处理对象。当你不得不处理对象时,有时最好的方法就是子类化。
以UIViewController
为例,我们都必须用它来计算。据我所知,没有UIViewControllerProtocol
。这意味着UIViewController
有很多你不能通过声明协议一致性来重新实现的外挂行为。如果你想让你的应用程序的主UIViewController
具有自定义功能--我们都这样做--你必须对它进行子类化。然后你通过继承得到所有这些行为。
我想另一种说法是,在那些情况下,类继承优于协议扩展,因为您别无选择,只能处理设计时没有协议的对象。
对我们这些迅速的人来说,这种情况经常发生。
https://stackoverflow.com/questions/30828465
复制