2013-05-31 63 views
0

非常感謝您的閱讀。在Java中實現「重新定義」屬性的最佳方式是什麼?

我所說的「重新定義」是UML規範中被廣泛使用的概念。

我的理解是:「重新定義」屬性的類型是「重新定義」屬性類型的子類。雖然「重新定義」屬性的所有者是「重新定義」屬性所有者的子類。

考慮下面的例子:

Duration extends ValueSpecification 
DurationInterval extends Interval 
Interval has two attributes typed by ValueSpecification, min and max; 
DurationInterval has two "redefined" attributes typed by Duration, min and max; 

這是我實現:

1)如果我在DurationInterval定義最小/最大,我躲在另一場;實際上,這是實現「重新定義」屬性的最簡單方法。任何人都爲這種實現投票?

public Duration min/max; 

2)然後,我推出了「消氣」,大,Oracle描述的「協變返回類型」,所以這樣的作品。 但是,我必須向下投下該類型才能使其工作。

3)對於「Setters」,但是,如果我添加「@Override」,我會得到錯誤。我認爲這是有爭議的;首先,我不得不承認,甲骨文明確表示這不是重寫。其次,我認爲這是「Override」,只是Oracle還沒有實施。我錯了,因爲我不知道他們這樣做的原因?

4)你在UML的重定義屬性上的實現是什麼?

public class RedefineProj { 
    static class ValueSpecification{} 
    static class Duration extends ValueSpecification{} 
    static class Interval{ 
     public ValueSpecification min; 
     public ValueSpecification max; 

     public ValueSpecification getMin(){ 
      return min; 
     } 
     public ValueSpecification getMax(){ 
      return max; 
     } 
     public void setMin(ValueSpecification min_){ 
      min = min_; 
     } 
     public void setMax(ValueSpecification max_){ 
      max = max_; 
     } 
    } 
    static class DurationInterval extends Interval{ 
     @Override 
     public Duration getMin(){ 
      return (Duration) min; 
     } 
     @Override 
     public Duration getMax(){ 
      return (Duration)max; 
     } 
     public void setMin(Duration min_){ 
      min = min_; 
     } 
     public void setMax(Duration max_){ 
      max = max_; 
     } 
    } 

    public static void main(String[] args) { 
     // TODO code application logic here 
     Interval i = new Interval(); 
     ValueSpecification v = i.getMax(); 

     DurationInterval di = new DurationInterval(); 
     Duration d = di.getMax(); 
    } 
} 
+1

請遵守Java慣例並使用**小寫字母**例如'setMin(...)'。大寫字母用於類名。 –

+0

謝謝,更正 – milesma

回答

0

最簡單的方法就是像你在你的第一個點做重新定義的屬性。

protected Duration min; 
protected Duration max; 

這樣你就可以隱藏父類定義的屬性。由於這不是一個真正的重新界定,你必須做更多的工作才能執行其類型。必須更改setter方法才能接受Duration對象。你可以這樣做是這樣的:

@Override 
public void setMin(ValueSpecification min_) 
{ 
    min = (min_ instanceof Duration) ? min_ : min; 
} 

@Override 
public void setMax(ValueSpecification max_) 
{ 
    max = (max_ instanceof Duration) ? max_ : max; 
} 

爲什麼你的新二傳的方法不從Interval重寫者的原因是因爲他們有不同的參數,因此被作爲單獨的方法處理(這個概念被稱爲重載)。在你的代碼中,原始的setter方法仍然可以在DurationInterval的對象上調用。另一方面,上面的代碼覆蓋父方法並修改它們以僅接受持續時間輸入(其他人只是被忽略;如果你想要,你可以拋出一個異常)。

附註:您不應將屬性定義爲public,因爲所有對象都可以直接訪問它們,並且可以將它們置於無效狀態(例如空值,負值等)。總是跟private一起去,或者如果你想讓他們在protected的兒童課程中可以使用。

+0

接受你的所有意見。此外,如果傳入的min_/max_不是instanceof持續時間,則最小/最大值保持其原始值或拋出異常是有爭議的。引入一個帶有顯式參數類型的非覆蓋setter作爲「Duration」也是一個候選者。無論如何,只需等待另外2天,看看是否有彈出更好的解決方案。 – milesma

相關問題