2012-06-05 46 views
0

我有一個類C擴展B。和B延伸A。 A有一個屬性名稱。我不希望看到名稱屬性在C類。Java擴展一個對象,除了父母的某些屬性

我該怎麼辦忽略?

PS:如果在Java中不可能:我正在開發一個使用Apache CXF並具有Web服務功能的Spring項目。我想從客戶端獲取B類型對象,並將C類型對象發送給客戶端。由於我的設計問題,我不想改變我的繼承機制。如果有方法可以忽略C類的名稱字段嗎?我正在實現第一代碼風格。

+0

@SamirMangroliya我想在B上訪問它? – kamaci

回答

0

我有一個班C擴展B。和B延伸A。 A有一個屬性 名稱。我不希望看到名稱屬性在C類。

根據您的編輯,你是試圖隱藏從超類(A)中的一個的序列化表示形式的屬性它的子類(C)。假設您正在使用JAX-WS/JAX-RS,您可以通過覆蓋子類中的屬性並應用註釋將其標記爲不符合序列化條件來做到這一點。要應用的主要註釋將是JAXB註釋@XmlTransient。如果您提供將對象序列化爲JSON的選項,您也可以@JsonIgnore屬性。僞代碼如下所示:

@XmlRootElement 
public class A implements Serializable { 
    private String name; 

    // ... 
} 

@XmlRootElement 
public class C extends A { 

    @Override 
    @XmlTransient 
    public String getName() { 
     return super.getName(); 
    } 
} 
+0

這對我很有幫助謝謝。不過,我沒有getters和setter爲我的類變量。 XmlTransient註釋的作品,但我怎樣才能使它在序列化工作,但不是在反序列化? – kamaci

+0

將getter/setter添加到您的子類中,並使用@XmlTransient標記getter – Perception

1

您可以將中的name字段聲明爲private,並將A和B保留在相同的包中。

package A; 
Class A { 

protected String name; 

} 



Class B extends A{ 
    // B can access A's attribute 
    } 



package C; 


    Class C extends B{ 
     // C cannot access name attribute defined in A. 
    } 

並保持C是在一個不同的包。

+0

在這種情況下,B也將無法看到名稱屬性。 –

+0

您可能想要使用(默認),然後保護... –

1

請閱讀有關繼承的組合。如果你需要隱藏一些元素,那麼你可能無法正確理解面向對象的代碼設計。

您提供的示例太窄而無法創建更好的答案。但是什麼時候隱藏在C中,你可以將它投射到A並仍然使用它?

+0

其實我想在oo設計的路上,但是C和B是DTO對象,並且當添加操作發生時,我會收到B,但是如果客戶想要某物。與得到我將發送C. – kamaci