我有一个名为Relation
的接口,由类BasicRelation
实现,并由子类扩展(例如ParentChild
,Sibling
,Spouse
)。在开发我的代码时,我意识到我经常需要一种方法,它使用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}}?如果不是,我应该以完全不同的方式设计它吗?我想最后一个问题更多的是对设计建议的要求而不是问题。
答案 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();
}
}