条款三十三:将非尾端类(non-leaf classes)设计为抽象类(abstract classes)
来源:互联网 发布:阿里云如何挂载数据盘 编辑:程序博客网 时间:2024/06/13 11:20
条款三十三:将非尾端类(non-leaf classes)设计为抽象类(abstract classes)
假如我们希望管理两个类,他们有以下集成结构:
下面是我们的类的定义:
class Animal { public: Animal& operator=(const Animal& rst); }; class Lizard:public Animal { public: Lizard& operator=(const Lizard& rst); }; class Chicken:public Animal { public: Chicken& operator=(const Chicken& rst); }; class Animal { public: Animal& operator=(const Animal& rst); }; class Lizard:public Animal { public: Lizard& operator=(const Lizard& rst); }; class Chicken:public Animal { public: Chicken& operator=(const Chicken& rst); };
现在我们需要实现对象之间的赋值,可以将赋值操作声明为virtual,这样就可以定位到具体的类进行操作。但是又带来一个问题这个代码允许不同类型之间的赋值,但是这样做明显是不对的。一种有效的做法是在对传入函数的指针进行操作之前进行动态类型转换当传入的对象并不是我们期望的时候会抛出bad_cast exception异常这样就可以避免不同类型之间的转换。
Lizard& Lizard::operator=(const Animal& rst) { const Lizard& rst_liz = dynamic_cast<const Lizard&>(rst); //TODO:... }
另一种不需要dynamic_cast支持的方法是 将父对象的赋值重载方法声明为私有的这样也可以达到目的,但是问题是Animal不能赋值给Animal。
class Animal { private: Animal& operator=(const Animal& rst); }; class Lizard:public Animal { public: Lizard& operator=(const Lizard& rst); }; class Chicken:public Animal { public: Chicken& operator=(const Chicken& rst); };
Animal ob1, ob2; ob1 = ob2; //error 试图调用私有方法
我们需要考虑的是既然在程序中需要将Animal实例化为什么不可以为三者共同构建一个抽象类,即便逻辑上Aniaml是其他两个类的基类。
class AbstractAnimal { protected: AbstractAnimal& operator=(const AbstractAnimal& rst); public: virtual ~AbstractAnimal() = 0; }; class Animal:public AbstractAnimal { public: Animal& operator=(const Animal& rst); }; class Chicken:public AbstractAnimal { public: Chicken& operator=(const Chicken& rst); }; class Lizard:public AbstractAnimal { public: Lizard& operator=(const Lizard& rst); };
从上面看出在我们写程序的时候不要简单的从逻辑上直接映射类与类之间的关系,用上面的方法也许是一个不错的选择。
0 0
- 条款三十三:将非尾端类(non-leaf classes)设计为抽象类(abstract classes)
- More Effective C++ Item M33:将非尾端类设计为抽象类
- Effective Java 18:接口优于抽象类 Prefer interfaces to abstract classes
- 类-Classes
- 条款三十: Proxy classes(替身类、代理类)
- Nested Classes,Static Classes,Non-static Classes,Inner Classes,Local Classes,Anonymous Classes
- All about abstract classes
- Interfaces vs Abstract Classes...
- All about abstract classes.
- Abstract Classes Vs Interfaces
- Abstract Classes (C++)
- All about abstract classes
- C# - Abstract Classes
- Java Abstract Classes
- 15.4. Abstract Base Classes
- 异常类exception classes
- C#类(Classes)
- C#类(Classes)
- 超强、超详细Redis数据库入门教程
- java script的小基础
- 关于ASP.NET MVC 里Razor语法
- Leetcode-64. Minimum Path Sum
- Activity, Fragment, WebView的状态保存和恢复
- 条款三十三:将非尾端类(non-leaf classes)设计为抽象类(abstract classes)
- maven中tomcat插件设置启动内存
- 博为峰Java技术文章 ——JavaEE Hibernate修改数据
- 工作室项目之寝室群聊的实现
- android release版本混淆排查
- 【caffe-windows】 caffe-master 之 mnist 超详细
- 可变参数列表及printf函数的实现
- 7.2.1
- 悲观的并发策略——Synchronized互斥锁