代码改变世界

WebWork深度探索之号外

2004-08-14 09:03  FantasySoft  阅读(...)  评论(...编辑  收藏

        昨天开始对WebWork进行了一些初步的探索[1],虽然进展缓慢,但是在阅读与分析其源代码的时候,还是有颇多的收获。这些所得并不属于探索WebWork本身,因而将此篇列为号外。
        在ActionFactory类中,有如下代码:

public abstract class ActionProxyFactory {
  
static ActionProxyFactory factory = new
 DefaultActionProxyFactory();
  
public static void setFactory(ActionProxyFactory factory) 
{
     ActionProxyFactory.factory 
=
 factory;
   }

  
public static ActionProxyFactory getFactory() {
    
return
 factory;
   }

}

        对于类ActionProxyFactory而言,setFactory方法用于设置静态类变量factory的初始值,如果该方法没有被调用的话,那么通过getFactory方法就会获得ActionProxyFactory默认派生子类的实例。这样的设计最大的好处就是灵活,即使在整个流程当中改变了ActionProxyFactory的实现,对外的接口也是一直保持不变。
        接着,就是DefaultActionProxyFactory的代码了:

public class DefaultActionProxyFactory extends ActionProxyFactory {
    
public DefaultActionProxyFactory() 
{
            super();
       }

}

        DefaultActionProxyFactory的实现平淡无奇,只是构造函数的实现激起了我的兴趣,首先,ActionProxyFactory作为其父类,本身是一个Abstract的类,既然是这样,ActionProxyFactory是不允许被实例化的,那么她哪里来构造函数呢?其次,子类被实例化的时候,就是构造函数被调用的时候,默认是先调用父类默认的构造函数的(默认构造函数就是不带参数的构造函数),那么代码中的super()是不是有点多余了呢?由第二个问题引申开去,就产生了另外一个很基本的问题,如果父类中定义了包含参数的构造函数,而且是多个的时候,子类在默认情况下会调用哪一个呢?
        第一、Abstract类是拥有构造函数的,可以通过在AbstractProxyFactory中定义带参数的构造函数来证明这一点。虽然Abstract类的构造函数不能够直接通过new操作去调用,但是它可以被子类的构造函数调用。因为继承是让子类拥有跟父类一样的行为和属性,而继承很大的一部分工作都是依靠调用父类的构造函数来完成,如果父类没有构造方法,又如何实现继承呢?
        第二、我个人认为super()是多余的,因为默认的构造函数本来就会做这样的工作;
        第三、在默认情况下,哪个都不会被调用。也就是说如果父类定义了包含参数的构造函数,那么子类必须在其构造方法中显式调用父类的构造方法,否则无法编译通过。
    
         [1] WebWork深度探索之盲人摸象