[英]What design pattern to use for a method implementation which is repeated in all classes implementing same interface?
[英]How to design a common static method in all classes implementing an interface
我有一个名为Relation
的接口,由BasicRelation
类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
,我想它向上的层次结构。 问题是该方法的内部细节依赖于子类,因此我不能将它作为接口Relation
或超类BasicRelation
的static
方法。
不幸的是,在Java中,也不可能有static abstract
方法。
有没有办法确保BasicRelation
每个子类(或实现Relation
每个类)都实现fromSentence(String)
? 如果不是,我应该以完全不同的方式设计它吗? 我想最后一个问题更多的是对设计建议的要求而不是问题。
为什么静态方法需要在接口中? 什么阻止你拥有一个“实用工具”课程并在那里有方法?
public class RelationUtility {
public static BasicRelation relationFactory(String asString) {
....
}
}
作为一种静态方法,除了访问私有成员之外没有任何理由,这也可以通过对这些成员的“默认”权限来实现....
您可以尝试将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
}
}
如果我理解正确......你可以尝试这样的方法
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建议也许是一种选择。
你可以让抽象类BasicRelation包含抛出异常的静态方法。 这样,当您使用它时,您将被迫覆盖(影子)子类中的静态方法。
就像是:
public abstract class BasicRelation {
public static List<..> fromSentence(String s) {
throw new RuntimeException();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.