背景简介
Eiffel是一种面向对象的编程语言,它为创建可重用的软件提供了丰富的特性。在本章中,我们将深入了解Eiffel中对象的深层复制、克隆与比较,以及对象的传递和存储方式。此外,我们还将探讨字符串处理和创建对象的过程,以及如何通过设计来避免一些常见错误。最后,我们将通过案例研究来了解在实践中如何设计可重用的软件。
深层复制、克隆与比较
Eiffel提供了 deep_copy
、 deep_clone
和 deep_equal
等深层版本的例程,用于解决浅层测试时无法追踪对象内部所有引用的问题。这些例程能够深入数据结构内部,复制或比较每个引用链末端的值。例如,比较两个三角形对象时,会逐个字段进行比较,直到得出 deep_equal(tri1, tri2)
的结果。这一过程忽略了对象的具体内存位置,只关注于值的比较。
传递与存储对象
在Eiffel中,对象是通过引用传递的。如果需要在不同位置使用同一个对象,那么这个对象必须从创建它的地方传递到使用它的地方,并存储为第二个对象的属性。例如,在模拟送信系统中,信件对象由写者创建,然后传递给邮递员,最终邮递员将信件送到读者手中。这个过程涉及对象的引用传递和存储。
字符串处理
在Eiffel中,字符串是一种引用类型。由于字符串是引用类型,通常不会使用创建指令来创建它;它通常要么被赋予一个常数值,一个字面值,要么是从键盘输入赋值的值。当进行字符串输入时,需要通过特定的命令读取输入,并使用 clone
方法来获取输入字符串的新副本。
创建对象与常见错误
创建对象时,如果对象的初始值为Void,需要调用创建例程来初始化对象。如果对象只在一个类中使用,则不需要创建例程;如果对象在另一个类中创建,则需要将其作为参数传递并存储其值。常见错误包括未将对象值传递给使用对象,导致运行时出现Void引用错误。
接口设计与重用原则
Eiffel支持重用设计,通过清晰的接口定义来实现。接口的定义包括例程名称、参数类型、返回类型、头部注释以及断言。这些元素定义了如何与例程交互,而无需关心其内部实现细节。设计可重用的软件需要从一开始就考虑未来的用户,而不仅仅是当前的使用场景。
类的行为与实现
在Eiffel中,类的行为主要通过命令和查询来定义。命令改变对象的状态,而查询则返回对象的状态信息。类的行为比实现更重要,因此在类的定义中,所有特性都同等缩进,表明它们在行为上的平等地位。类的外部特性可以通过导出策略来控制,该策略定义了哪些特性可以从类外部访问。
总结与启发
本章深入探讨了Eiffel语言在对象行为和接口设计方面的一些关键概念。我们了解到深层复制、克隆与比较的重要性,以及如何通过引用传递和存储对象来管理内存。字符串的处理和创建对象的过程也得到详细阐述,包括创建例程的使用和常见错误的防范。通过案例研究,我们还学习了如何设计可重用的软件,并理解了类的行为与实现之间的关系。
阅读本章后,我们应该意识到在编写代码时不仅要关注实现的细节,还要注重接口的设计,因为这将直接关系到软件的可重用性和可维护性。在未来的设计和编程实践中,我们应该始终牢记这些原则,并将它们应用到我们的工作中,以提高代码质量并减少未来的错误。