Java 如何在实现接口的所有类中设计通用静态方法
我有一个名为Java 如何在实现接口的所有类中设计通用静态方法,java,inheritance,interface,static,abstract,Java,Inheritance,Interface,Static,Abstract,我有一个名为关系的接口,由类基本关系实现,并由子类(例如父子女,兄弟姐妹,配偶)扩展。在开发代码时,我意识到我经常需要一种方法,该方法采用关系的字符串表示来创建它。例如: public class ParentChild implements Relation extends BasicRelation { // e.g. "Jack is Emily's father. Jill is her mother." will return the list // <ParentCh
关系
的接口,由类基本关系
实现,并由子类(例如父子女
,兄弟姐妹
,配偶
)扩展。在开发代码时,我意识到我经常需要一种方法,该方法采用关系的字符串
表示来创建它。例如:
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) {
...
}
}
公共类ParentChild实现关系扩展基本关联{
//例如,“杰克是艾米丽的父亲,吉尔是她的母亲。”将返回列表
//
来自句子的静态列表(字符串s){
...
}
}
现在,由于我发现自己在每个类中都需要这个方法(fromstation(String)
),除了在BasicRelation
中之外,我想将它向上移动。问题是该方法的内部细节依赖于子类,因此我不能将其作为接口关系或超类基本关系中的静态方法
不幸的是,在Java中,也不可能有静态抽象
方法
有没有办法确保基本关系的每个子类
(或者实现关系的每个类
)都实现fromstation(String)
?如果没有,我应该用完全不同的方式来设计它吗?我猜最后一个问题与其说是一个问题,不如说是一个设计建议的请求。为什么静态方法需要在接口中?是什么阻止了你拥有一个“实用”类和方法
public class RelationUtility {
public static BasicRelation relationFactory(String asString) {
....
}
}
作为一个静态方法,除了访问私有成员之外,没有其他原因,这也可以通过对这些成员的“默认”权限来实现。…您可以尝试将BasicRelation类设置为抽象类,并使用abstract From句子(…)方法。这将要求ParentChild类重写并实现FromSequence方法,因为如果不实现FromSequence()就无法为ParentChild创建对象
公共抽象类基本关系扩展关系(){
来自句子的公共摘要列表(字符串s);
}
公共类ParentChild实现关系扩展基本关系{
fromstation(){
//parentChild类的实现
}
}如果我理解正确。。。你可以尝试这样的方法
public class BasicRelation {
public abstract List<ParentChild> fromSentenceInSubclass(s);
public List<ParentChild> fromSentence(String s){
fromSentenceInSubclass(s);
}
}
公共类基本关系{
B类句子的公共摘要列表;
公共列表fromstation(字符串s){
来自B类的句子;
}
}
然后你可以:
public class SubclassRelation extends BasicRelation {
public List<ParentChild> fromSentenceInSubclass(s){
// do subclass relation stuff
}
}
公共类子类关系扩展了基本关系{
类中句子的公共列表{
//做子类关系的事情
}
}
您可能需要稍微更改代码,并添加一些泛型,以使其按您想要的方式发生。
Sotirios Delimanolis工厂建议也可能是一个选项。您可以让抽象类BasicRelation包含引发异常的静态方法。这样,当您使用静态方法时,您将被迫覆盖(阴影)子类中的静态方法
比如:
public abstract class BasicRelation {
public static List<..> fromSentence(String s) {
throw new RuntimeException();
}
}
公共抽象类基本关系{
来自句子的公共静态列表(字符串s){
抛出新的RuntimeException();
}
}
不,没有办法强制实现静态
方法。为什么它需要是静态的?这里最好使用某种工厂。或者你可以使用其他类和静态方法,比如fromstation(String,Relation)?这些子类特有的事情应该由子类通过多态性来完成。或者查看访问者模式。但是静态方法不能是抽象的。从本质上说,我的整个困境就是这样开始的。我希望我的方法保持静态,因为它独立于类实例;事实上,它用于生成实例列表。您建议的两种方法都适用于非静态方法。但是我想保持这个方法是静态的,因为调用它是为了生成一系列子类实例,而这个方法本身是独立于实例的。。。不确定这是否是一个“设计智慧”的好主意,但肯定是一个有趣的方法!
public abstract class BasicRelation {
public static List<..> fromSentence(String s) {
throw new RuntimeException();
}
}