如何在实现接口的所有类中设计公共静态方法

时间:2014-10-02 03:35:19

标签: java inheritance interface static abstract

我有一个名为Relation的接口,由类BasicRelation实现,并由子类扩展(例如ParentChildSiblingSpouse)。在开发我的代码时,我意识到我经常需要一种方法,它使用String表示关系来创建它。例如:

public class ParentChild implements Relation extends BasicRelation {

  // e.g. "Jack is Emily's father. Jill is her mother." will return the list
  // <ParentChild(Jack, Emily), ParentChild(Jill, Emily)>
  static List<ParentChild> fromSentence(String s) {
    ...
  }
}

现在,因为我发现自己在每个类中都需要这个方法(fromSentence(String)),除了BasicRelation之外,我想将它移动到 up 层次结构中。问题是该方法的内部细节依赖于子类,因此我不能将它作为static接口Relation或超类BasicRelation中的static abstract方法。

不幸的是,在Java中,也不可能有BasicRelation方法。

有没有办法确保Relation的每个子类(或实现fromSentence(String)的每个类)都实现{{1}}?如果不是,我应该以完全不同的方式设计它吗?我想最后一个问题更多的是对设计建议的要求而不是问题。

4 个答案:

答案 0 :(得分:1)

为什么静态方法需要在接口中?什么阻止你拥有一个&#39; Utility&#39;上课,并在那里有方法?

public class RelationUtility {
    public static BasicRelation relationFactory(String asString) {
        ....
    }
}

作为一种静态方法,除了访问私人成员之外没有任何理由,这也可以通过“默认”来实现。对这些成员的权限....

答案 1 :(得分:0)

您可以尝试将BasicRelation类作为抽象类,并使用抽象fromSentence(..)方法。这将要求ParentChild类覆盖并实现fromSentence方法,因为如果不实现fromSentence()

,则无法为ParentChild创建对象
public abstract class BasicRelation extends Relation(){

   public abstract List<..> fromSentence(String s);
}

public class ParentChild implements Relation extends BasicRelation {

 fromSentence(){
 //parentChild class's implementation
}

}

答案 2 :(得分:0)

如果我理解正确......你可以尝试这样的方法

public class BasicRelation {

    public abstract List<ParentChild> fromSentenceInSubclass(s);

    public List<ParentChild> fromSentence(String s){
        fromSentenceInSubclass(s);
    }
}

然后你可以:

public class SubclassRelation extends BasicRelation {

    public List<ParentChild> fromSentenceInSubclass(s){
        // do subclass relation stuff
    }

}

您可能需要稍微更改一下代码并添加一些Generics,以便按照您想要的方式实现。 Sotirios Delimanolis Factory建议也可能是一种选择。

答案 3 :(得分:0)

您可以让抽象类BasicRelation包含抛出异常的静态方法。这样,当你使用它时,你将被迫覆盖(阴影)子类中的静态方法。

类似的东西:

public abstract class BasicRelation {
    public static List<..> fromSentence(String s) {
        throw new RuntimeException();
    }
}