计算机程序的构造和解释(笔记)
2.4抽象数据的多重表示
2.4.1 复数的表示
数据抽象已经介绍过了,具体看之前的2.1数据抽象引导
这里介绍的是抽象数据的多重表示(个人理解类似overload重载,忽略类中的具体函数实现,直接使用对应的函数中的方法method)
书上给的是一个复数实现的例子,分别使用直角坐标表示 和 极坐标表示法,来实现底层的封装
例如上述中的复数运算add或mul-comoplex,可以忽略底层是哪个实现的,只要计算时候调用正确就可以。
2.4.2 带标志数据
值得是给一个标志来区分底层具体使用 直角坐标表示 和 极坐标表示法的哪一个
类似C++ 的 前置++ 和后置++ 的重载operator的实现吧
这里具体一点:
// 前置版本,返回递增对象的引用
class ClassA{
classA& operator++();
...
};
ClassA& ClassA::operator++(){
++curr;
return *this;
}
// 后置版本,返回递增对象的原值
// 注意加入一个额外的(不被使用的)int类型的形参,仅仅为了区分
ClassA{
classA& operator++(int);
...};
classA ClassA::operator++(int){
ClassA ret= *this ; // 保存当前值
++*this;
return ret ;
}
// 调用:
ClassA a;
a.operator++(); //前置版本
a.operator++(0); //后置版本
2.4.3 数据导向的程序设计的可加性
2.5 带有通用型操作的系统
2.5.1 通用形算术运算
这里我参照C++prime的chap14 函数调用运算符来理解,也就是忽略参数的类型的不同,但最终调用的方法相同
也就是:
2.5.2 不同类型的数据结合
- 强制
这里说的应该是cast
- 类型的层次结构(对比oop中的对象继承吧)
这里有几个概念:
-
- 类型塔
-
- 子类型 :(也就是子类啦)例如整数是有理数的子类,对于有理数的操作都可以应用于整数
-
- 超类型:(父类) 这里有理数是整数的父类
层次结构的不足
这里果然谈到了多重继承,类之间的继承不是单一等问题哈哈o(*≧▽≦)ツ
问题如下图:
2.5.3 实例:符合代数
有事暂时意识流了,习题不想看…. ╮( ̄▽ ̄”)╭