1

如果我有一个无法更改的课程(在罐子内),例如。

public class AA implements A{
  private String s = "foo";
  public String getValue() { return s; }
}

覆盖该 getValue() 方法的好方法是什么?我的方式一直是复习课。前任。

public class AB implements A{
  private String s = "foo";
  public String getValue() { return s + "bar"; }
}

谢谢!

4

3 回答 3

5

无论您做什么,都无法访问私有变量(没有反射)。如果您需要它的值,请在您的 getter 中调用超类的 getter,以获取该值,然后随意操作它。您可以通过执行调用超类的方法

super.getValue();

在您的getValue实施中。

鉴于您的更新

public class AB extends AA {
  public String getValue() { 
      String superS = super.getValue();
      return superS + "bar"; 
  }
}

请注意以下事项

1)我使用extends的是你不使用的。extends用于扩展类,implements用于实现接口。
2)我没有阴影s。我把它留在超级班上。我只是将 supergetValue与您指定的装饰结合使用。

于 2012-07-06T18:40:00.503 回答
4

有两种方法可以解决这个问题:

1)使用继承。

public B extends A{
    public String getValue(){
     String s = super.getValue();
     // do something with s
     return s;
  }
}

这可以正常工作,但用户仍然可以B转换AB继承自A. 这意味着您仍然可以A.getValue()从课程中访问B,这不是您想要的。

2)另一种解决方案是使用适配器模式

public B {
  private A a = new A();
  public String getValue(){
     String s = a.getValue();
     // do something with s
     return s;
  }
}

这样,B使用A和隐藏它。B没有to的演员表A是可能的,也没有电话A.getValue()可用。

于 2012-07-06T18:46:39.090 回答
0

这就是封装的用途......您的示例指向名为OCP(开放封闭原则)的设计原则。

这意味着类是对扩展开放的,而不是对修改开放的。您可以使用 jars 方法访问其私有变量,但不能以非法方式对其进行修改。

您可以通过仅访问超类的 getter 方法来访问超类中的私有变量。

于 2012-07-06T18:43:39.667 回答