如何正确实现影响不同类私有部分的方法

时间:2012-01-31 08:53:50

标签: oop private encapsulation

每当我遇到 atomic 方法应该访问不同类的私有部分的情况时,OOP基本上不可能正确地实现这样的事情让我感到沮丧。

考虑一个简单的例子:某种类型的集合应该跟踪其成员,成员应该跟踪它们的所有者(例如,游戏中生物和位置之间的关系)。我没有看到实现成员与OOP安全集合的添加,删除和转换的完美方式。我倾向于使用的“较小的邪恶”是 doAction - 方法和通知 - 方法。所以成员集合示例看起来像这样(在Java中):

class Member{
  private Collection owner;
  // notification methods
  public void notifyMoved(Collection to){
    owner = to;
  }
  // action methods
  public void moveTo(Collection to){
    owner.notifyRemoved(this);
    to.notifyAdded(this);
    owner = to;
  }
}

class Collection{
  private List<Member> members;
  // notification methods
  public void notifyAdded(Member item){
    members.add(item);
  }
  public void notifyRemoved(Memer item){
    members.remove(item);
  }
  // action methods
  public void add(Member item){
    item.notifyMoved(this);
    members.add(item);
  }
}

问题是通过直接调用通知方法可能会破坏一致性。 有没有更好的方法来实现这样的事情? C ++有朋友,但一般来说Java和OOP呢?

修改即可。在Java中,我可以将它们放在一个包中,但我不想这样做只是为了能够访问某些方法。我的问题更为一般和理论 - 如果行动(方法)与一个特定的对象类无关,那么它应放在何处;如果这些行动需要访问他们的私人,该怎么办。

解决方案摘要

  1. 通知方法。通知程序根据声明的环境变化更改对象的内部状态。手动调用通知是对一致性的威胁。
  2. 特定语言的访问者
    • Java :包私有访问。
    • Java :嵌套类。 (例如,集合是外部的,成员是内部的。)
    • C ++ :朋友类。

1 个答案:

答案 0 :(得分:1)

这是java的缺点,因为它缺乏“朋友”的概念。您可以将它们放在同一个包中,并为方法使用“package”访问修饰符(package = no access modifier)。