• 骨架类


    通过对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接口,但是可以选择地实现它的方法,并不需要全部实现,因为接口本质上也是抽象类。另外,抽象类可以定义已经实现的方法,所以就可以增加一些“基础方法”,供子类调用。


     

    具体代码如下:

     1 /**
     2  * 
     3  */
     4 package 骨架类;
     5 
     6 /**
     7 * <p>Title:Test </p>
     8 * <p>Description: TODO</p>
     9 * <p>Company: </p>
    10 * @author wcs
    11 * @date 2019年12月23日下午9:38:26*/
    12 public class Test {
    13 
    14     /**
    15     * @param args
    16     * <p>Title: Test</p>
    17     * <p>return_type:void </p>
    18     * <p>Company: </p>
    19     * @author wcs
    20     * @date 2019年12月23日下午9:38:26*/
    21 
    22     public static void main(String[] args) {
    23         // TODO Auto-generated method stub
    24         FooBar fb = new FooBar();
    25         fb.setVal("val");
    26         System.out.println(fb.getVal());
    27         fb.foo();
    28 
    29     }
    30 
    31 }
    32  interface IFoo {
    33     void foo(); 
    34     void add();
    35     void del();
    36 }
    37  interface IBar extends IFoo{
    38      void bar(); 
    39 }
    40  abstract  class AbstractFoo implements IFoo{
    41      private String val;
    42      public String getVal() {
    43                return val;
    44      }
    45      public void setVal(String val) {
    46                this.val = val;
    47      }
    48      public void foo() {
    49          System.out.println("AbstarctFoo");
    50 }      
    51      public void add() {
    52                System.out.println("AbstarctFoo");
    53      }        
    54 }
    55  class FooBar extends AbstractFoo implements IBar{
    56     @Override
    57     public void bar() {
    58               // yingkhtodo Auto-generated method stub
    59               
    60     }
    61     @Override
    62     public void add() {
    63               // yingkhtodo Auto-generated method stub
    64               
    65     }
    66     @Override
    67     public void del() {
    68               // yingkhtodo Auto-generated method stub
    69               
    70     }
    71 }

     
     
  • 相关阅读:
    msado15.tlh中重要的枚举(精简)
    VC连接SQL2005(例子ADO_2)
    [转]VC++创建一个线程并传递参数
    vc实现文件的打印--BOOL Print_html(const char *sURL)
    求一个整数n对16求商和余数
    vc下文件的创建--使用fstream和CFile
    vc连接Access2003
    Goldengate Parameter SUPPRESSTRIGGERS & DEFERREFCONST
    DEFERRED_SEGMENT_CREATION
    Duplicate standby database from active database
  • 原文地址:https://www.cnblogs.com/wcss/p/12088656.html
Copyright © 2020-2023  润新知