2016-04-25 98 views
-2

我有一個在每個子類中重複的相同方法,我想將它重構爲超類中的一個方法。父類中的java繼承設置值

public class SubClass1 extends SuperClass { 
     private BoltHexHead bolt; 
     private void computeFoo() { 
      //Foo formula is identical in all subclasses. Need to move up 
      setFoo(bolt.getDiameter() + bolt.getPitch() + bolt.getTpi()); 
     } 
     private void computeBar() { 
      //computeBar method in all subclasses but Bar formula is different amongst all subclasses 
      setBar(bolt.getDiameter() - 2*bolt.getPitch() - 3*bolt.getTpi()); 
     } 
     private void computeSeparation() { 
      //computeSeparation method only exists for a Subclass 1 
      setSeparation(bolt.getLength() - 2*nut.getFlatDia()); 
     } 



    public class SubClass2 extends SuperClass { 
     private BoltFlatHead bolt; 
     private void computeFoo() { 
      //Foo formula is identical in all subclasses. Need to move up 
      setFoo(bolt.getDiameter() + bolt.getPitch() + bolt.getTpi()); 
     } 
     private void computeBar() { 
      //computeBar method here is different than in Subclass1 
      setBar(bolt.getDiameter() - 4*bolt.getPitch() - 1/3*bolt.getTpi()); 
     } 
     private void computeProtrusion() { 
      //computeProtrusionmethod only exists for a Subclass 2 
      setProtrusionmethod(bolt.getThreadAngle() - 6*bolt.getTpi()); 
     } 

起初我張貼bolt沒有得到在超集,但是在子類。我得到了什麼後,我的戰後初期工作是以下

public abstract class SuperClass { 
    protected Bolt<?> bolt; <-- this was added but uses wildcard 
    ...bolt getters/setter 

     protected void computeFoo() { 
      //Foo formula pulled up from all subclasses 
      setFoo(bolt.getDiameter() + bolt.getPitch() + bolt.getTpi()); 
     } 
    } 

public class SubClass1 extends SuperClass { 
    //private BoltHexHead bolt; <-- commented this out in each subclass 
} 

這是一個JSF應用程序,並在每個控制器豆我實例的具體的聯合屬性的子類,然後設置特定螺栓。早先的設計決定是使用setter來設置子類中的螺栓(和其他屬性),而不是使用構造函數來完成;但是每次只有一個重構。

Controller for a Bolt Analysis using a HexHead Bolt 
    private SubClass1 sc1 = new SubClass1(); 
    private BoltHexHead bolt; 
    sc1.setBolt(bolt); 
    sc1.computeResults(); 

Controller for a Bolt Analysis using a FlatHead Bolt 
    private SubClass2 sc2 = new SubClass2(); 
    private BoltFlatHead bolt; 
    sc2.setBolt(bolt); 
    sc1.computeResults(); 

所以我的問題是,是否確定使用通配符Bolt<?> bolt或者是有沒有更好的方法?

+0

怎麼辦?我沒有從倒票中學到什麼。這是因爲我沒有根據SO要求提出問題,還是因爲我的Java方法不合適? – jeff

+0

目前尚不清楚你想要達到的目標。子類「bolt」的值來自哪裏?爲什麼不使用構造函數? – Savior

+0

@Pillar經常會因爲放太多的代碼而受到影響。我試圖讓一個超類的方法使用適用於所有子類的公式計算值。 – jeff

回答

1

我只是試圖把一個相同/重複的方法從我所有的子類到父,但其中一個變量(螺栓)在Java中,你不能是沒有得到設置,因爲

那覆蓋字段。 所以你的變量「私人B螺栓;」在你的超類和「私人BoltHexHead螺栓;」在你的子類中是兩個不同的東西。他們實際上同時存在。

你想要做的事情其實並不那麼複雜。你只需要清理你的代碼:

  1. 只定義「私人B螺栓;」並且它的制定者/獲得者曾經在你的超級類別中。
  2. 只使用這些getter/setter方法來訪問螺栓
  3. 如果你希望你的子類有一個類型爲「BoltHexHead」的「博爾特」,然後在類定義("extends JointAttribute<BoltHexHead>" instead of "extends JointAttribute<Bolt<BoltSpec>>")

定義泛型參數本身示範purspose一個簡單的例子:

超類:

public class Superclass<T> { 

    private T value; 

    protected T getValue() { 
     return value; 
    } 

    protected void setValue(T value) { 
     this.value = value; 
    } 

    protected void print() { 
     if(getValue()==null) { 
      System.out.println("NULL"); 
     } else { 
      System.out.println(getValue().toString()); 
     } 
    } 
} 

Subclass1:

public class Subclass extends Superclass<String> { 

    public Subclass() { 
    } 

    public static void main(String[] args) { 
     Subclass subclass= new Subclass(); 
     subclass.print(); 
     subclass.setValue("test"); 
     subclass.print(); 
    } 
} 

Subclass2:

public class Subclass2 extends Superclass<Integer> { 


    public Subclass2() { 
    } 

    public static void main(String[] args) { 
     Subclass2 subclass= new Subclass2(); 
     subclass.print(); 
     subclass.setValue(3); 
     subclass.print(); 
    } 
} 
+0

確定這是有幫助的,但在父類中,Eclipse表示「方法getMinor_diameter_min()對於類型B是未定義的」,並且其修復方法是投射到Bolt。但是「((螺栓)螺栓).getMinor_diameter_min()」Eclipse抱怨說「螺栓是一種原始類型。參考通用類型螺栓應該參數化」當我將我的超類更改回JointAttribute > – jeff