Exercise Requirements
一、GIS地理实体系统(C++版)
- 设计基类
GeographicEntity,需要实现一个地理实体的基类,包含以下要素:
- 使用访问控制符(private/protected/public)区分数据隐私性
- 将核心不变数据设为私有,中间数据设为受保护
- 通过虚函数定义接口规范
- 正确使用基类指针/引用处理派生类对象
- 构造函数需要初始化所有私有成员和受保护成员
- 析构函数需要执行清理操作,并输出析构信息(便于追踪对象生命周期)
- 需要考虑异常情况(如ID为空的处理)
- 设计派生类
Point,需要实现一个点实体类继承自GeographicEntity:
- 正确调用基类构造函数(使用初始化列表)
- 展示派生类对基类函数的重写(面积计算返回0)
- 设计派生类
LineString,需要实现一个线实体类继承自GeographicEntity:
- 展示受保护成员的使用
- 添加函数实现线段长度计算(可使用欧式距离)
- 重写函数实现面积段长度计算(返回0)
- 每次getLength都需要判断是否重新计算长度
- 动态管理容器成员
- 设计派生类
Polygon,需要实现一个面实体类继承自GeographicEntity:
- 展示派生类对基类函数的正确重写
- 在构造函数中初始化面积和周长
- 每次添加顶点后需要重新计算面积和周长
- 测试任务
- 创建测试程序
main.cpp
- 使用基类指针数组或
vector<GeographicEntity*>存储不同类型的派生类对象
- 创建3个
Point对象,3个LineString对象,3个Polygon对象
- 通过基类指针调用函数
- 输出所有地理实体的信息(类型、坐标、计算结果等)
- 内存管理与对象生命周期追踪
- 正确使用
new和delete动态分配和释放对象
- 在析构函数中输出析构信息,验证销毁顺序
- 观察构造与析构的执行顺序,理解派生类对象的生命周期
- 演示派生类成员重写
- 展示不同派生类对
calculateArea()和render()的不同实现
- 调用派生类特有的成员函数(如
getElevation(), getLength(), getPerimeter())
- 验证访问控制的正确性(尝试访问私有成员应产生编译错误)
二、GIS地理实体系统(Java版)
- 设计基类
GeographicEntity,需要实现一个地理实体的基类,包含以下要素:
- 使用访问控制符正确区分成员可见性
- 通过
protected提供派生类需要的访问权限
- 构造函数初始化所有私有和受保护成员
- 自动记录对象创建时间
- 初始化属性列表为空列表
- 构造函数应包含参数合法性检查
- 设计派生类
Point,需要实现一个点实体类继承自GeographicEntity:
- 使用
super()调用基类构造函数
- 展示派生类对基类函数的重写(面积计算返回0)
- 设计派生类
LineString,需要实现一个线实体类继承自GeographicEntity:
- 使用
List容器动态管理坐标点
- 每次添加点后自动更新总长度
- 展示受保护方法被派生类调用的场景
- 正确实现坐标距离计算
- 设计派生类
Polygon,需要实现一个面实体类继承自GeographicEntity:
- 展示派生类对基类方法的重写
- 复杂的数学计算
- 受保护方法的合理使用
- 在构造函数和修改方法中维护数据一致性
- 测试任务
- 创建测试程序
Main.java
- 创建
List<GeographicEntity>存储不同类型的派生类对象
- 创建3个
Point对象,3个LineString对象,3个Polygon对象
- 输出所有地理实体的信息
- 演示继承
- 遍历集合,调用
getEntityType()和calculateArea(),观察多态行为
- 对不同类型的对象进行类型转换并调用派生类特有方法
- 使用
instanceof进行类型检查
- 演示派生类成员重写
- 实现集合统计功能:计算所有实体的总面积、平均坐标等
- 调用派生类特有的成员函数(如
getElevation(), getLength(), getPerimeter())