2015-07-28 48 views
0

我有兩個關於內部類的問題。首先是擴展和覆蓋子類中內部類的方法和屬性。
假設我有一個包含派生屬性的內部類的超類。使用內部類進行子類化,僅序列化外部

class ASuper implements Serializable { 
    // Attributes, methods 
    int a; 
    int b; 

    class Inner { 
     // Derived attributes, methods 
     int c; 
     int d; 
     public calculate() { 
      c = a + b; 
      d = a * b; 
     } 
    } 
} 

我想繼承ASuper以這樣的方式,一些在內部類的子類的屬性被賦予新的價值,有些是相同的。

class ASub extends ASuper { 
    int e; 

    class Inner { 
     int f; 
     public calculate() { 
      // int c = same as in the super class 
      f = a^b - e; 
     } 
    } 
} 

我真的不明白如何做到這一點。我是否必須重寫int c的定義ASub.Inner.calculate()或者我可以參考super?

第二個問題是關於序列化。外部類的對象必須是可序列化的,但內部類的相應對象不需要,因爲它們的所有屬性都是從外部對象的屬性派生的。我如何實現這一點?

+1

這並沒有真正回答這個問題,但當事情變得複雜時,我通常避免使用內部類,並在構造函數中明確地將'ASuper'的實例傳遞給'Inner'。 – biziclop

+0

你的內部類不包含任何「派生屬性」。派生類的內部類不會爲第一個內部類的任何屬性提供任何新值。你的內部類的屬性不是從它們的外部類派生的。不清楚你在說什麼。或問。 – EJP

+0

也許我使用錯誤的術語。 「派生」屬性指的是來自其他屬性的_calculated_屬性。像上面例子中的屬性'c','d'和'f'。 – Zeron

回答

3

首先你誤解了內部類的概念。 您的ASub.Inner班完全與ASuper.Inner無關。 你無法訪問其領域或其他東西。

其實內心的課是很簡單的事情。這只是同普通班有兩個例外:

  • 它可以訪問外部類的實例字段(因爲它有隱藏reffernce到外部類的實例)
  • 領域和外部類的方法是可見它即使被標記爲private

關於你以後的問題。必須標記爲Serializable以防止序列化它。內部類也不例外。只有一點需要注意,如果你的內部類是可序列化的,它的外部類必須也是因爲內部到外部的隱藏引用。

+0

謝謝。 我想我只需要使用派生屬性,就好像它們是普通屬性一樣。或者我必須重新提出我的問題,以便問題變得更加清晰。 – Zeron

+0

如果使用繼承,則可以派生*屬性。內部類與繼承無關。 – talex

+0

那麼,屬於同一類中的其他屬性的_calculated_的合適名詞是什麼?我不記得適當的名詞。例如,如果'paintComponent'方法使用從類中的屬性計算出的某些值。因此,不需要每次調用'paintComponent'時計算它們,都可以方便地計算一次並存儲結果。 – Zeron