对于骨架类(AbstractInterface)的理解



通过对Java源码的学习我们会发现,AbstractCollection实现了Collection接口,List接口继承自Collection接口,AbstractList又继承了AbstractCollection类,并且实现了List接口。

诸如此种的还有AbstarctSet,AbstarctList,AbstarctMap,都是继承了一个抽象类,又实现了一个上层接口,对此感到不解。

         后来在effective Java上看到,这样做的好处:痛过对你导出的每个重要接口都提供一个抽象的骨架实现类(skeletal implementation)类,把接口和抽象类的优点结合起来。接口的作用仍然是定义类型,但是骨架实现类接管了所有与接口实现相关的工作。

我对于骨架类的理解是:使得具体子类只专注于自身的特定方法实现,忽略自身不会提供的方法(对于自身的冗余方法).简单说就是没必要一个个实现接口的所有方法,要调用就调用骨架类的.而这里ArrayList不允许忽略任何list接口的方法,必须自己去小心实现每个方法.当有某类只继承abstractlist,那就方便了,只要改写需要改写的部分.

下例中AbstractFoo是一个骨架类,它实现了IFoo接口,并实现了其中的我认为以后大家会公用的基础方法foo(),又增了自己独有的方法,setVal()和getVal()方法。而另一个接口叫IBar,我想让它具有IFoo的属性,又有一些自己的个性,这时让它继承IFoo接口,然后增加自己独有的方法bar()。最后,我定义一个实例,让它继承AbstractFoo,并实现IBar,这样,它就不用重新一一定义IFoo接口中的方法,因为骨架类(AbstractFoo)已经有基础的方法了,它只需要实现不共用的方法即可。

另外,公开的接口,如IFoo是不能修改的,以后我发现还有些公共的东西能加进来,怎么办呢?我可以在骨架类(AbstractFoo)中设置新的方法,让子类继承就ok了,如例子中的setVal()和getVal()方法,这样,在Test中,我完全可以定义一个FooBar实例,然后调用新增加的setVal()和getVal()方法.这就很好的达到了复用的目的。这里也呈现出抽象类的一个好处。

骨架类(AbstractFoo)是个抽象类,它实现了IFoo接口,但是可以选择地实现它的方法,并不需要全部实现,因为接口本质上也是抽象类。另外,抽象类可以定义已经实现的方法,所以就可以增加一些“基础方法”,供子类调用。


 

具体代码如下:

package effectiveJava.chapter18;

public interface IFoo {

         void foo();

         void add();

         void del();

}

package effectiveJava.chapter18;

public interface IBar extends IFoo{

         void bar();

}

package effectiveJava.chapter18;

public abstract   class AbstractFoo implements IFoo{

         private String val;

         public String getVal() {

                   return val;

         }

         public void setVal(String val) {

                   this.val = val;

         }

        

         public void foo() {

                   System.out.println("AbstarctFoo");

         }       

}

package effectiveJava.chapter18;

public class FooBar extends AbstractFoo implements IBar{

         @Override

         public void bar() {

                   // yingkhtodo Auto-generated method stub

                  

         }

         @Override

         public void add() {

                   // yingkhtodo Auto-generated method stub

                  

         }

         @Override

         public void del() {

                   // yingkhtodo Auto-generated method stub

                  

         }

}

package effectiveJava.chapter18;

/**

*

*

* Title: <br>

* Description: <br>

* Copyright: Copyright (c) 2007<br>

* Company: 北京紫光华宇软件股份有限公司<br>

*

* @author yingkh

* @version 1.0

* @date 2010-8-20

*/

public class Test {

         /**

         * @param args

         */

         public static void main(String[] args) {

                   FooBar fb = new FooBar();

                   fb.setVal("val");

                   System.out.println(fb.getVal());

                   fb.foo();

         }

}

通过对Java源码的学习我们会发现,AbstractCollection实现了Collection接口,List接口继承自Collection接口,AbstractList又继承了AbstractCollection类,并且实现了List接口。

诸如此种的还有AbstarctSet,AbstarctList,AbstarctMap,都是继承了一个抽象类,又实现了一个上层接口,对此感到不解。

         后来在effective Java上看到,这样做的好处:痛过对你导出的每个重要接口都提供一个抽象的骨架实现类(skeletal implementation)类,把接口和抽象类的优点结合起来。接口的作用仍然是定义类型,但是骨架实现类接管了所有与接口实现相关的工作。

我对于骨架类的理解是:使得具体子类只专注于自身的特定方法实现,忽略自身不会提供的方法(对于自身的冗余方法).简单说就是没必要一个个实现接口的所有方法,要调用就调用骨架类的.而这里ArrayList不允许忽略任何list接口的方法,必须自己去小心实现每个方法.当有某类只继承abstractlist,那就方便了,只要改写需要改写的部分.

下例中AbstractFoo是一个骨架类,它实现了IFoo接口,并实现了其中的我认为以后大家会公用的基础方法foo(),又增了自己独有的方法,setVal()和getVal()方法。而另一个接口叫IBar,我想让它具有IFoo的属性,又有一些自己的个性,这时让它继承IFoo接口,然后增加自己独有的方法bar()。最后,我定义一个实例,让它继承AbstractFoo,并实现IBar,这样,它就不用重新一一定义IFoo接口中的方法,因为骨架类(AbstractFoo)已经有基础的方法了,它只需要实现不共用的方法即可。

另外,公开的接口,如IFoo是不能修改的,以后我发现还有些公共的东西能加进来,怎么办呢?我可以在骨架类(AbstractFoo)中设置新的方法,让子类继承就ok了,如例子中的setVal()和getVal()方法,这样,在Test中,我完全可以定义一个FooBar实例,然后调用新增加的setVal()和getVal()方法.这就很好的达到了复用的目的。这里也呈现出抽象类的一个好处。

骨架类(AbstractFoo)是个抽象类,它实现了IFoo接口,但是可以选择地实现它的方法,并不需要全部实现,因为接口本质上也是抽象类。另外,抽象类可以定义已经实现的方法,所以就可以增加一些“基础方法”,供子类调用。


 

具体代码如下:

package effectiveJava.chapter18;

public interface IFoo {

         void foo();

         void add();

         void del();

}

package effectiveJava.chapter18;

public interface IBar extends IFoo{

         void bar();

}

package effectiveJava.chapter18;

public abstract   class AbstractFoo implements IFoo{

         private String val;

         public String getVal() {

                   return val;

         }

         public void setVal(String val) {

                   this.val = val;

         }

        

         public void foo() {

                   System.out.println("AbstarctFoo");

         }       

}

package effectiveJava.chapter18;

public class FooBar extends AbstractFoo implements IBar{

         @Override

         public void bar() {

                   // yingkhtodo Auto-generated method stub

                  

         }

         @Override

         public void add() {

                   // yingkhtodo Auto-generated method stub

                  

         }

         @Override

         public void del() {

                   // yingkhtodo Auto-generated method stub

                  

         }

}

package effectiveJava.chapter18;

/**

*

*

* Title: <br>

* Description: <br>

* Copyright: Copyright (c) 2007<br>

* Company: 北京紫光华宇软件股份有限公司<br>

*

* @author yingkh

* @version 1.0

* @date 2010-8-20

*/

public class Test {

         /**

         * @param args

         */

         public static void main(String[] args) {

                   FooBar fb = new FooBar();

                   fb.setVal("val");

                   System.out.println(fb.getVal());

                   fb.foo();

         }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值