2012-06-05 43 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