Androidの抽象クラスとインタフェースの実践

7308 ワード

1.抽象クラスについて
抽象クラスといえば、抽象メソッドに言及しなければならない.抽象メソッドとは、クラスにメソッド体がないメソッドを指し、抽象クラスの抽象メソッドはクラスに実装されなければならない.抽象メソッドを含むクラスを抽象クラスと呼びますが、抽象クラスに抽象メソッドが含まれていなければいいですか?答えはいいが、抽象クラス自体の使い道と意味を失っている.抽象方法は継承のために存在するからだ.
注意点
  • 抽象クラスには実装されていないメソッドが含まれているため、抽象クラスを使用してオブジェクトを作成することはできません.
  • 抽象クラスはprivateとして宣言できず、abstractはfinalと並列に同じクラスを修飾できません.そうしないと、サブクラスは継承できません.
  • 子クラスが親クラスの抽象メソッドを実装していない場合、子クラスも抽象クラスとして定義する必要があります.
  • 抽象クラスの一般的なメソッドは、実装する必要はありませんが、子クラスの抽象メソッドは親クラスの抽象メソッドと同名ではありません.
  • abstractはprivate、static、finalまたはnativeと並列に同じ方法を修飾することはできません.

  • 2.インタフェースについて
    インタフェースは抽象クラスよりも抽象的な「クラス」であり、「」を付けるのは、インタフェースに静的コードブロックや静的メソッドが含まれず、一般的にインタフェースに変数を定義せず、サブクラスはimplementsキーワードを用いてインタフェースを実現するためである.インタフェースの変数は暗黙的にpublic static final変数として指定する(かつpublic static final変数のみでprivate修飾でコンパイルエラーを報告する)クラス名で直接アクセスできる:ImplementClass.nameであり、メソッドはpublic abstractメソッドとして暗黙的に指定され、public abstractメソッドのみであり(private、protected、static、finalなどの他のキーワードでコンパイルエラーを報告する)、インタフェース内のすべてのメソッドは具体的に実現できず、インタフェース内のメソッドは抽象的なメソッドでなければならない.
    インタフェースを実装する非抽象サブクラスは、インタフェースのすべての方法を実装する必要があります.抽象サブクラスは実装されなくてもよい.newオペレータを使用してインタフェースをインスタンス化することはできませんが、インタフェースを実装するクラスのオブジェクトを参照する必要があるインタフェース変数を宣言できます.instanceofを使用して、オブジェクトが特定のインタフェースを実装しているかどうかを確認できます.たとえば、if(anObject instanceof Comparable){}です.
    3.抽象クラスとインタフェースの違い
  • 1.サブクラスは1つの抽象クラスしか継承できませんが、複数のメソッドを実装できます.
  • 2.抽象クラスには特定のメンバーメソッドが実装され、インタフェースにはpublic abstract抽象メソッドしか存在しません.
  • 3.抽象クラスのメンバー変数は様々なタイプであってもよく、インタフェースのメンバー変数はpublic static finalタイプのみである.

  • 4.Androidでの具体的な使用
    設計の面では異なり、抽象クラスは多くのサブクラスの親として、テンプレート式の設計モードであり、新しい方法を追加する必要がある場合は、抽象クラスで実現するだけで、各サブクラスを修正する必要はありません.インタフェースは、放射設計モードであり、標準が変更されると、すべての従属もそれに応じて変更される動作基準のようです.
    インタフェースインスタンス
    public interface IOpenApiDataServiceCallback<T> {  
     public abstract void onGetData(T data);  
     public abstract void onGetError(int errorCode, String errorMsg, Throwable error);  
    }   

    サブクラスでの実装
    @Override  
     public void onGetData(ActionResponse data) {  
      mActivitiesLv.onRefreshComplete() ;  
      if(data.isSuccess()){  
       mMultiStateView.setViewState(MultiStateView.ViewState.CONTENT,"");  
       mAdapter.clear() ;  
       mAdapter.addData(data.data) ;  
       mAdapter.notifyDataSetChanged() ;  
      }else{  
       mMultiStateView.setViewState(MultiStateView.ViewState.EMPTY,data.msg);  
      }  
     }  
    
     @Override  
     public void onGetError(int errorCode, String errorMsg, Throwable error) {  
      mMultiStateView.setViewState(MultiStateView.ViewState.ERROR,this.getResources().getString(R.string.net_error_tip));  
     }

    抽象メソッド
    public abstract class BaseActivity extends BaseProtectActivity {  
     protected TitleBarView mHeaderMenu;  
     protected void initHeader(){   
      mHeaderMenu = (TitleBarView) findViewById(R.id.main_header) ;  
      if(mHeaderMenu!=null){   
       mHeaderMenu.setCommonTitle(View.VISIBLE, View.VISIBLE, View.GONE, View.GONE) ;  
       mHeaderMenu.setBtnLeft(R.drawable.head_back,  
         R.string.whitespace);   
       mHeaderMenu.setBtnLeftOnclickListener(new OnClickListener() {  
    
        @Override  
        public void onClick(View v) {  
         finish();  
        }  
       }) ;  
      }  
     };  
    
     @Override  
     protected void onCreate(Bundle savedInstanceState) {  
      super.onCreate(savedInstanceState);  
      //SwipeBackHelper.onCreate(this);  
      setContentView(getContentLayout());  
      initHeader();  
      initView();  
      setListener() ;  
     }  
    
     @Override  
     protected void onPostCreate(Bundle savedInstanceState) {  
      super.onPostCreate(savedInstanceState);  
      //SwipeBackHelper.onPostCreate(this);  
     }  
    
     @Override  
     protected void onDestroy() {  
      super.onDestroy();  
      //SwipeBackHelper.onDestroy(this);  
     }  
    
    
     public void setListener() {}  
    
     public void initView(){};  
    
     protected abstract int getContentLayout();  
    
     public void afterLogin(){} ;  
    }  

    サブクラスでの実装
    protected int getContentLayout() {  
      return R.layout.mine_action_center;  
     }