类层次结构中的Java可选接口

假设您有一个大约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,以便为真正可能的少数人提供服务?

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()”,否则不能.你是否“戳()”取决于是否想要戳戳以及物体是否接受戳戳.我可以使用访问者模式,但这似乎使它更复杂.

解决方法:

如果一个类不可用,我建议不要实现Pokeable接口,因为这会让人感到困惑.

请改用以下方法之一.

>创建一个实现Pokable的BaseClass的抽象或具体子类,并让所有可能的Pokeable子类扩展它.如果通过所有实现类中的相同逻辑实现poke(),则此方法很有效.
>让每个子类单独实现Pokeable

上一篇:javascript – 为什么element.style在CSS中提供样式时总是返回空?


下一篇:android – appcompat库样式如何工作