我对如何实现以下情况感到非常困惑。我想这样做:
Integer getScore(String string)
:
boolean isComplete(POJO pojo)
:
考虑此:
public class ATypology extends TypologyScore {
@Override
public Integer getScoreByWords(Integer integer) { return 0; }
@Override
public boolean execute(POJO pojo) { /* */ }
}
public class BTypology extends TypologyScore {
@Override
public Integer getScoreByWords(Integer integer) { return 1; }
@Override
public boolean execute(POJO pojo) { /* */ }
}
public class CTypology extends TypologyOperation {
// i don't want it
@Override
public Integer getScore(String string) { return 0; }
@Override
public boolean execute(POJO pojo) { /* */ }
}
public abstract class TypologyScore extends TypologyOperation {
public Integer getScore(String string) {
/* ... */
return this.getScoreByWords(integer);
}
// template method
public abstract Integer getScoreByWords(Integer integer);
}
public abstract class TypologyOperation {
public abstract Integer getScore(String string);
public boolean isComplete(POJO pojo) { return this.execute(pojo) && /* ... */; }
// template method
public abstract boolean execute(POJO pojo);
}
public class POJO {
public Integer getScore() { return typologyOperation.getScore(string); }
public boolean isComplete() { return typologyOperation.isComplete(this); }
}
基本上我有一系列取决于对象类型的条件,TypologyScore
中有1个公共条件允许子类覆盖(ATypology
,BTypology
),而其他条件与TypologyOperation
中的全局条件共享让其他子类覆盖(ATypology
,BTypology
,CTypology
)
但是问题是在CTypology
类中,我需要实现public Integer getScore(String string)
,但我不想要它,因为它永远不会使用它。有什么办法可以解决这个问题,也许是像访问者模式这样的设计模式?
如果是这样,结构会是什么样?
PS:我改写这个问题,因为我以前有一些印刷错误发布。谢谢。
您当前不是强制来在getScore()
上实现CTypology
,因为您在TypologyScore
的父类中提供了它的实现。
但是,如果您不希望该方法对CTypology
的成员完全适用,那么您的案例就是违反SOLID设计原则的Interface Segretation principle的一个很好的例子:
在软件工程领域中,接口隔离原则(ISP)规定不应强迫任何客户依赖它不使用的方法。 Wikipedia
我想您会在第一个引用来源中找到所需的答案,但要总结您的情况及其解决方案:
CTypology
类实现方法Integer getScore(String string)
,该方法与该类的目的无关,因此被迫返回null或0。这里是CTypology
的类层次结构的示例(从下至上阅读:]
Interface BasicTopologyOperation { boolean isComplete(POJO pojo); boolean execute(POJO pojo) }
/ \
implements
/ \
abstract class TypologyOperation boolean isComplete(POJO pojo) { /* */ } abstract boolean execute(POJO pojo);
/ \
extends
/ \
class CTypology
ATypology
和BTypology
的类层次结构几乎相同,它们只是实现了一个附加接口:
Interface BasicTopologyOperation { boolean isComplete(POJO pojo); boolean execute(POJO pojo) }
/ \
implements
/ \
abstract class TypologyOperation boolean isComplete(POJO pojo) { /* */ } abstract boolean execute(POJO pojo);
/ \
extends AND also implements
interface ScoredTypology { Integer getScore(String string): }
/ \
classes ATypology and BTypology