3

假设您有大约 30 个类的 Java 类层次结构,其中有一个基类 BaseClass 和两个主要子类(SubclassA、SubclassB),每个子类有几个子类。其中一些子类具有特定的行为。假设你可以“戳”它们,改变它们的状态。(这是向现有层次结构添加行为的新要求。“Poke”对大多数类来说毫无意义。)

interface Pokeable {
  void poke();
  int getTimesPoked();
}


public class Pokey extends SubclassB 
implements Pokeable {
  private int timesPoked = 0;
  public void poke() {
    timesPoked++;
  }
  public int getTimesPoked() {
    return timesPoked;
  }
}

这是否应该通过仅在那些需要它的类中实现 Pokeable 来完成,然后在所有必须戳任何可戳对象的代码中执行以下操作?

public void process(BaseClass b) {
  if (b instanceof Pokeable) {
    ((Pokeable)b).poke();
  }
}

或者整个层次结构是否应该为了少数真正 Pokeable 的人而实现 Pokeable?

interface Pokeable {
  void poke();
  int getTimesPoked();
  boolean isReallyPokeable();
}

public class BaseClass implements Pokeable {
  public void poke() {}
  public int getTimesPoked() { return 0; }
  public boolean isReallyPokeable() { return false;}
}

public class Pokey {
  private int timesPoked = 0;
  @Override
  public void poke() {
    timesPoked++;
  }
  @Override
  public int getTimesPoked() {
    return timesPoked;
  }
  @Override
  public boolean isReallyPokeable() {
    return true;
  }
}

public void process(BaseClass b) {
  b.poke();
}

编辑补充说:这是一种双重调度问题。在“扑克”代码对对象执行某些操作的情况下,如果对象是“可戳的”,则它必须调用“poke()”,否则就不能。是否“poke()”取决于某物是否想要戳以及对象是否接受被戳。我可以使用访客模式,但这似乎使它更复杂。

4

3 回答 3

4

如果一个类是不可破解的,我建议不要使用它来实现Pokeable接口,因为这会让人困惑。

请改用以下方法之一。

  • 创建BaseClass该 implements的抽象或具体子类Pokable,并让您所有的Pokeable子类扩展它。poke()如果ing 通过所有实现类中的相同逻辑实现,则此方法效果很好。
  • 让每个子类Pokeable单独实现
于 2012-06-18T19:21:57.470 回答
2

我认为拥有一个名为“isReallyX”的方法是一个警告信号。如果有人一眼看到一个类并发现它是“可戳的”,他们可能会尝试戳它并最终出现意想不到的行为,因为它并不是真正可戳的。

我会采用您以前的方法,因为它不会误导外部程序员(或忽略此代码两个月后的您自己!)

于 2012-06-18T19:21:48.557 回答
0

如果您不想实现父类的所有方法,您的子类可能是抽象的。但....

或者整个层次结构是否应该为了少数真正 Pokeable 的人而实现 Pokeable?

绝对不行......不可戳的类不应该实现可戳接口。

这是否应该通过仅在那些需要它的类中实现 Pokeable 来完成,然后在所有必须戳任何可戳对象的代码中执行以下操作?

这是一个稍微好一点的模型......但是,它是一个非常程序化的设计。

还可以将对象的集合保留在<Pokeable>某处,然后快速迭代该集合以将它们全部戳穿吗?

你能让 pokeable 类注册到事件调度器吗?...所以当某个事件发生时,所有的类都被戳了?

于 2012-06-18T19:16:20.443 回答