2016-05-06 9 views
2

私はJavaで書く必要がある3つのクラスがあります。これらは、引数としてTask1、Task2、Task3と呼ばれます。1つの違いで3つのクラスを構成する方法

3つのタスクは、タスクの「タイプ」が異なることを除いて全く同じです。したがって、Task1のフィールドタイプは "Task1"となります。

私はこの1つの違いで3つのクラスを書いていました。しかし、基本クラスのTaskを作成し、このクラスを3つのサブクラスに拡張するほうがよいと思います。

しかし、私はこれを行う方法を理解することはできません。

package com.scoular.model; 

public class TaskBase implements Serializable { 

    private static final long serialVersionUID = -5867831497684227875L; 

    private String unid; 
    private String type; 
    private Number order; 

    public TaskBase() { 
    } 

    public void create() { 
     try { 
      clear(); 
      newNote = true; 
      Session session = Factory.getSession(); 
      Date date = new Date(); 
      crtDte = session.createDateTime(date); 
      crtUsr = session.getEffectiveUserName(); 
     } catch (Exception e) { 
      XspOpenLogUtil.logError(e); 
     } 
    } 

    public void loadByUnid(String unid) { 
... 
    } 

    public void loadValues(Document doc) { 
... 
    } 

    private void clear() { 
... 
    } 

    public boolean save() { 

     boolean tmpSave = true; 

      Document doc = null; 
      Session session = Factory.getSession(); 
      Database PCDataDB = session.getDatabase(PCConfig.getpcDataDBpath()); 

      if (newNote) { 
       doc = PCDataDB.createDocument(); 
       doc.put("order", this.getNextOrder(doc)); 
      } else { 
       doc = PCDataDB.getDocumentByUNID(unid); 
      } 
      doc.put("title", title); 
      doc.put("notes", notes); 

      doc.save(); 

     return tmpSave; 
    } 

    // Getters and Setters for common fields 

    public String getUnid() { 
     return unid; 
    } 

    public void setUnid(String unid) { 
     this.unid = unid; 
    } 

    public String getType(String type) { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public Number getOrder() { 
     return order; 
    } 

    public void setOrder(Number order) { 
     this.order = order; 
    } 

} 

そして、私のスーパークラスは、次のようになります:

マイベースコールは、次のようになります

package com.scoular.model; 

import com.scoular.model.TaskBase; 

public class Task extends TaskBase implements Serializable { 

    private static final long serialVersionUID = -5867831497684227875L; 

    // Custom Fields 

    public Task() { 

     super(); 
     this.setType("Build"); 
    } 

} 

私は余分なコードの一部を切り取ってきました。基本的には、私はTaskBaseをインスタンス化しないので抽象クラスを必要とすると思います。私は実装でこれを行うこともできると理解していますが、それをよく理解していません。

ご協力いただければ幸いです。

答えて

1

protected子クラスからフィールドに到達できます。したがって、typeのフィールドを `protectedにして、子クラスに希望する値を代入することができます。

TaskBaseクラス:

`public abstract class TaskBase implements Serializable { 

    private static final long serialVersionUID = -5867831497684227875L; 

    private String unid; 
    protected String type; 
    private Number order; 

Taskクラス:

public class Task extends TaskBase implements Serializable { 

    private static final long serialVersionUID = -5867831497684227875L; 

    // Custom Fields 

    public Task() { 

     super(); 
     type = "build"; 
    } 

} 
1

Java Genericsは、この場合には有用であろう。

class Task<T> { 
    private T t; 
    T getTask() { return t; } 
    void setTask(T _t) { this.t = _t; } 
} 

Task<Task1> task1 = new Task<Task1>(); 
task1.setTask(sometask); 
0

Javaでは継承がeスーパークラスのみからの継承を許可します。 「インプリメンテーションインターフェイス」は、学ぶべき非常に強力なツールです。 Derek Banas Javaチュートリアル15と16(それぞれ10分未満)を見て、実装を使用してみてください。これらのチュートリアルが質問に答えることができない場合は、さらに援助を求めてください。

0

タスクのメンバーとメソッドを説明する抽象クラスを定義します。

public abstract class Task{ 

    private String unid; 
    private String type; 
    private Number order; 

    public Task() { 

    } 

    //if these are all the same for any subclasses, define them here instead of making them abstract 
    public abstract void create(); 
    public abstract void loadByUnid(String unid); 
    public abstract void loadValues(Document doc); 
    protected abstract void clear(); 

    public String getUnid() { 
     return unid; 
    } 

    public void setUnid(String unid) { 
     this.unid = unid; 
    } 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public Number getOrder() { 
     return order; 
    } 

    public void setOrder(Number order) { 
     this.order = order; 
    } 
} 

あなたの具体的な作業はすべて異なるものを実行しているので、あなたは、自分の行動を実装あなたの抽象タスクから具体的なクラスを定義することができます。これは私が何をしたいの音

public class Task1Impl extends Task implements Serializable { 

    private static final long serialVersionUID = -5867831497684227875L; 

    // Custom Fields 

    public Task1Impl() { 

     super(); 
     this.setType("Build"); 
    } 

    @Override 
    public void create() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void loadByUnid(String unid) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void loadValues(Document doc) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected void clear() { 
     // TODO Auto-generated method stub 

    } 

} 
+0

。抽象クラスの4つのクラスはすべて同じことをしますが、もちろん作成はもちろん型フィールドに異なる値を持ちます。だから私は、少なくとも3つの他のクラスは、抽象クラスにすることができます、それぞれのサブクラスのクラスを作成すると思うだろうが、それは多少の過剰な1つのプロパティですか? –

+0

私は私が続くことを確信していません。あなたの抽象クラスには他のクラスはありません。サブクラスは抽象クラスを拡張し、抽象クラスによって定義された抽象メソッドのいずれかの具体的なメソッドを定義します。 createメソッドを除いて他のものがすべて同じであれば、create(抽象クラ​​ス)以外のすべての抽象クラスの具体的なメソッド(protectedとして設定)を定義することができます。抽象クラス(具体的なバージョンのcreateを実装するTask1、Task2など)の具体的な拡張を定義することができます。 – Andonaeus

+0

申し訳ありませんが、ミスタイプ - 私は4つの方法を意味しました。 create()メソッドは、typeの値がサブクラス "Type1"などの "Type1"となることを除いて全く同じです。抽象クラスにcreateメソッドを持たせてリストアップするのは簡単なはずですが、create()を呼び出すときに何らかの形で型の値を入れておくように思えます。それほど大したことではありませんが、私は抽象クラスで変更されていない3つのクラスを残しておきます。 –

関連する問題