第20条:类层次优先于标签类
2016-07-26 22:04
169 查看
标签类值带有两种甚至多种风格的实例的类,如一个表示圆或者矩形的类:
这种标签类过于冗长,容易出错,并且效率低下。
在Figure类中,只有area方法是矩形或者圆都有的,将它放在类层次的根。
类层次可以反映正方形是一种特殊的矩形:
上述的域是被直接访问的,而不是通过访问方法,应该使用访问方法。
标签类很少适用的时候,当想要编写一个包含显式标签域的类时,考虑能否用类层次代替,当遇到一个包含标签域的现有类时,考虑将它重构到一个层次结构中。
class Figure { enum Shape { RECTANGLE, CIRCLE }; final Shape shape; double length; double width; double radius; Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } Figure(double length, double width) { shape = Shape.RECTANGLE; this.length = length; this.width = width; } double area() { switch(shape) { case RECTANGLE: return length * width; case CIRCLE: return Math.PI * radius * radius; default: throw new AssertionError(); } } }
这种标签类过于冗长,容易出错,并且效率低下。
在Figure类中,只有area方法是矩形或者圆都有的,将它放在类层次的根。
abstract class Figure { abstract double area(); } class Circle extends Figure { final double radius; Circle(double radius) { this.radius = radius; } double area() { return Math.PI * radius * radius; } } class Rectangle extends Figure { final double length; final double width; Rectangle(double length, double width) { this.length = length; this.width = width; } double area() { return length * width; } }
类层次可以反映正方形是一种特殊的矩形:
class Square extends Rectangle { square(double side) { super(side, side); } }
上述的域是被直接访问的,而不是通过访问方法,应该使用访问方法。
标签类很少适用的时候,当想要编写一个包含显式标签域的类时,考虑能否用类层次代替,当遇到一个包含标签域的现有类时,考虑将它重构到一个层次结构中。
相关文章推荐
- 深度学习斯坦福cs231n 课程笔记
- Java的基础知识4——容器
- UE4 启动器一系列问题处理链接
- ID卡的原理和ID卡复制器
- 顺序表应用5:有序顺序表归并
- 0726linux基础内容小记
- 企业信息化快速开发平台 JeeSite
- MySQL学习系列一---命令行连接mysql和执行sql文件
- C#使用Process类杀死进程,执行命令等
- redis学习笔记之list类型
- 使用Spring4+Maven构建webapp项目
- 哈希函数相关
- 签到
- MongoDB 删除集合
- MongoDB 删除集合
- MongoDB 删除集合
- 设计模式——抽象工厂
- 51nod 多重背包问题(动态规划)
- 简单整理下css中的几种定位 大神勿入
- POJ-1035-Spell checker