返回

iOS子类化之旅:错误中收获的经验

IOS

这篇文章和我通常写的文章有所不同。它不是一个指南更像是一系列想法和模式。我将要讲述的差不多所有模式都是通过犯错误这样艰难的方式找出来的。绝不是说我就是子类化方面的权威,但是,我只是想把我学到的一些事情分享出来。不要把它作为一个权威指南,而是一个例子集合。

当被问及面向对象编程时,我可能会说它是一门艺术,但是我其实并不认为它仅仅是像绘画或写作这样单纯的艺术。面向对象编程还充满了工程学的元素,这也正是这个学科如此激动人心的原因。

大多数的项目在开始编写代码时都是非常简单,开始后一切都会变得非常复杂。对于 iOS 项目,子类化是一个很常见的难题,尤其是在复杂的项目中。

从其他人的项目或苹果的框架中学到很多东西,并通过实践来发现什么是可行的方法。以下是一些我们从错误中总结出的方法:

  1. 使用组合,而非继承

继承是面向对象编程的一个重要概念,但它也可能带来许多问题。例如,当一个子类继承一个父类时,它会继承父类的所有方法和属性。这意味着如果父类发生改变,子类也必须随之改变。这可能会导致代码难以维护,特别是当父类是一个大型或复杂的类时。

组合是一种更好的方法,它允许你将不同的类组合在一起以创建新的类。这使得你可以重用代码并使你的代码更易于维护。例如,你可以创建一个Person类,它包含一个name属性和一个greet()方法。然后,你可以创建一个Student类,它继承Person类并添加一个grade属性。Student类可以重用Person类中的代码,并且它可以添加自己的方法和属性。

  1. 使用协议,而非继承

协议是另一种可以让你重用代码的工具。协议定义了一组方法和属性,类可以通过实现这些方法和属性来符合协议。这使得你可以将不同的类组合在一起,而无需继承。例如,你可以创建一个Drawable协议,它定义了一个draw()方法。然后,你可以创建一个Shape类,它符合Drawable协议并实现了draw()方法。你可以创建一个Circle类,它继承Shape类并添加了一个radius属性。Circle类可以重用Shape类中的代码,并且它可以添加自己的方法和属性。

  1. 使用扩展,而非继承

扩展是一种可以让你向现有类添加方法和属性的工具。这使得你可以扩展类的功能,而无需继承它。例如,你可以创建一个String扩展,它添加了一个reverse()方法。然后,你可以使用reverse()方法来反转字符串。

  1. 使用类别,而非继承

类别是一种可以让你向现有类添加方法和属性的工具。这使得你可以扩展类的功能,而无需继承它。例如,你可以创建一个Array类别,它添加了一个shuffle()方法。然后,你可以使用shuffle()方法来打乱数组。

  1. 使用代理,而非继承

代理是一种可以让你在一个对象和另一个对象之间创建通信通道的工具。这使得你可以让一个对象通知另一个对象有关其状态的变化。例如,你可以创建一个Button类,它包含一个delegate属性。然后,你可以创建一个ViewController类,它实现ButtonDelegate协议。当按钮被点击时,Button类会通知ViewController类。ViewController类可以响应通知并执行适当的操作。

  1. 使用通知,而非继承

通知是一种可以让你在对象之间发送消息的工具。这使得你可以让一个对象通知另一个对象有关其状态的变化。例如,你可以创建一个NotificationCenter对象,它可以存储通知。然后,你可以创建一个Button类,它会向NotificationCenter对象发送通知。ViewController类可以注册NotificationCenter对象以接收通知。当按钮被点击时,NotificationCenter对象会将通知发送给ViewController类。ViewController类可以响应通知并执行适当的操作。

  1. 使用键值观察,而非继承

键值观察是一种可以让你观察对象属性值变化的工具。这使得你可以当对象属性值发生变化时执行适当的操作。例如,你可以创建一个Person类,它包含一个name属性。然后,你可以创建一个ViewController类,它观察Person类的name属性。当Person类的name属性发生变化时,ViewController类会收到通知并执行适当的操作。