- 冒号空间 - https://blog.zhenghui.org -

Reply To: 抽象机制

过程抽象赋予程序员自定义函数或运算的能力。参数抽象和规范抽象在其中的体现应该是明显的,以开方函数sqrt(double number)为例:

number可以是任何一个非负double型变量,这是参数抽象;调用者不必关心sqrt的实现,只根据它的规范便确信sqrt(a)将保证返回a的一个平方根,这是规范抽象。


数据抽象赋予程序员自定义数据类型的能力。参数抽象和规范抽象在其中的体现与过程抽象是类似的。类型层级多态抽象则是在数据抽象的基础上融入了类族和多态的因素。


迭代抽象赋予程序员自定义循环的能力。在没有迭代抽象时,程序员如果需要遍历一个容器,需要关注不少的细节:如何获取容器的元素?何处是起点?何处是终点?遍历的方式(顺序、倒序、随机、跳跃)?这不仅增加了客户的负担,也限制了容器今后的变化(担心影响到客户)。

以Java的Iterator为例:

public interface Iterator<E>{

boolean hasNext(); // Returns true if the iteration has more elements.

E next(); // Returns the next element in the iteration.

void remove(); // Removes from the underlying collection the last element

}

要遍历一个容器,只需要获取它的一个Iterator对象即可。在这里,Iterator便是一个规范抽象,其规范体现在hasNext、next和remove的文档描述上。

更简单地,只要容器实现了Iterable接口,便可采用for-each循环:

for (ElementType element : elements) process(element);

在这里,连hasNext和next的调用都被隐去了,可以认为抽象得到了进一步的提升,此时迭代已经上升到了语言层面(借鉴了C#语法)。


Share