我有一个C 类扩展 B。和B 扩展 A。A 有一个属性name。我不想在 C 类中看到name属性。
我该怎么做才能忽略?
PS:如果在 Java 上不可能:我正在开发一个使用 Apache CXF 并具有 Web 服务功能的 Spring 项目。我想从客户端获取 B 类型对象并将 C 类型对象发送给客户端。由于我的设计问题,我不想改变我的继承机制。如果有办法我可以忽略 C 类的名称字段吗?我正在实施为第一代码风格。
我有一个C 类扩展 B。和B 扩展 A。A 有一个属性name。我不想在 C 类中看到name属性。
我该怎么做才能忽略?
PS:如果在 Java 上不可能:我正在开发一个使用 Apache CXF 并具有 Web 服务功能的 Spring 项目。我想从客户端获取 B 类型对象并将 C 类型对象发送给客户端。由于我的设计问题,我不想改变我的继承机制。如果有办法我可以忽略 C 类的名称字段吗?我正在实施为第一代码风格。
您可以在as中声明name
字段并将 A 和 B 保留在同一个包中。A
private
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 在不同的包中。
请阅读关于继承的组合。如果您需要隐藏一些元素,那么您可能没有正确理解面向对象的代码设计。
您提供的示例太窄,无法创建任何更好的答案。但是,当您可以将其强制转换为 A 并仍然使用它时,隐藏在 C 中的意义何在?
我有一个C 类扩展 B。和B 扩展 A。A 有一个属性 name。我不想在 C 类中看到name属性。
根据您的编辑,您正试图在其子类 (C) 之一的序列化表示中隐藏超类 (A) 的属性。假设您使用的是 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();
}
}