重构——54封装向下转型(Encapsulate Downcast)

封装向下转型(Encapsulate Downcast)

某个函数返回的对象,需要由函数调用者执行向下转型(downcast);将向下转型动作移到函数中

一、动机

1、向下转型是一种罪恶

2、java 5以后几乎可以绝迹

二、做法

1、找出必须对函数调用结果进行向下转型的地方

2、将向下转型搬移到该函数中

时间: 2024-10-24 17:09:02

重构——54封装向下转型(Encapsulate Downcast)的相关文章

重构——18自封装字段(Self Encapsulate Field)

自封装字段(Self Encapsulate Field) 你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙:为这个字段建立取值/设置函数,并且只以这些函数来访问字段 一.动机 如果你想访问超类中的一个字段,却又想在子类中将对这个字段的访问改为一个计算后的值,这就是该用Self Encapsulate Field的时候 二.做法 1.为待封装的字段建立取值/设值函数 2.找出该字段所有的引用点,将它们全部改为调用取值/设值函数 3.将该字段声明为private 4.复查,确保找出所有的引用

java自动向上向下转型,手动转型

问题描述 java自动向上向下转型,手动转型 子类 子类对象=new 父类构造函数 对吗 父类 父类对象=(父类)new 子类构造函数 错了吗 解决方案 这样写有好处么,正常写不行??? 解决方案二: 一般都是父类 父类对象=new 子类构造函数() 如果子类重写了父类的方法,调用时相当于调用的是子类重写的那个方法. 解决方案三: 关于java向下转型Java的向下转型java的向下转型

java中多态中向下转型的问题

问题描述 java中多态中向下转型的问题 public class Father { public void show (){ System.out.println("父类方法"); } public void show1(){ System.out.println("父类二方法"); } } public class Son extends Father { public void show(){ System.out.println("子类方法&quo

java向下转型和直接引用子类对象的区别

问题描述 java向下转型和直接引用子类对象的区别 class A{}class B extends A {}向下转型:A a = new B();B b = (B)a;直接调用子类: B b = new B();这两个 b 实例 有什么区别 解决方案 实现的功能没有区别.但是维护起来就不如第一个.第一个是父类引用指向之类对象.可以降低程序的耦合性,即调用者不必关心调用的是哪个对象,只需要针对接口编程就可以了,被调用者对于调用者是完全透明的.让你更关注父类能做什么而不去关心子类是具体怎么做的你可

求解一个关于向下转型时的问题!!!

问题描述 classAll{}publicclassBllextendsAll{publicstaticvoidmain(String[]args){Alla=newAll();if(ainstanceofBll){System.out.println("Test");Bllb=(Bll)a;}}}我在调试向下转型时为什么程序不能打印出Test,而把程序中Alla=newAll();改成Alla=newBll();后能打印出Test? 解决方案 解决方案二:Bll是什么样的解决方案三:

向上向下转型

问题描述 classA是classB的父类,那下面的两种情况有什么区别1:Aa=newB();Bb=(B)a;2:Aa=newA();Bb=(B)a; 解决方案 解决方案二:1正常2会在运行时会抛出ClassCastException解决方案三:向下转,要特别注意..解决方案四:引用1楼dreamhunter_lan的回复: 1正常2会在运行时会抛出ClassCastException 同意解决方案五:一楼正解,第一种是父类实例引用子类对象,其实你的实例a指向的是B类的一个对象,所以第一种正常.

Java 向上转型和向下转型的详解

Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展. 向上转型:子类引用的对象转换为父类类型称为向上转型.通俗地说就是是将子类对象转为父类对象.此处父类对象可以是接口 向下转型:父类引用的对象转换为子类类型称为向下转型. 前者是一个向上转型,Animal dog 引用指向new Dog();子类对象当成父类对象,只能调用父类的成员,如果子类

重构——28封装集合(Encapsulate Collection)

封装集合(Encapsulate Collection) 有个函数返回一个集合:让这个函数返回该集合的一个只读副本,并在这个类中提供添加/移除集合元素的函数 一.动机 1.取值函数不应该返回集合本身 2.不应该为整个集合提供一个设值函数 二.做法 1.加入为集合添加/移除元素的函数 2.将保存集合的字段初始化为一个空集合 3.编译 4.修改所有集合设值函数的调用者 5.编译,测试 6.找出所有通过取值函数获取集合并修改其内容的函数,修改之,每次修改后,编译并测试 7.修改集合取值函数自身,使它返

重构——27封装字段(Encapsulate Field)

封装字段(Encapsulate Field) 你的类中存在一个public字段:将它声明为private,并提供相应的访问函数 一.动机 面向对象的重用原则之一就是封装,或者称为"数据隐藏" 二.做法 1.为public字段提供取值/设值函数 2.找到这个类之外使用该字段的所有地点.如果客户只是读取该字段,就把引用替换为对取值函数的调用:如果客户修改了该字段,就将此引用点替换为对设值函数的调用 3.每次修改后,编译并测试 4.将字段的所有用户修改完毕后,将字段声明为private 5