问题
我正在尝试创建一个应用程序,其中的对象类可以实现一些 来自可用操作总池的操作。最终目标是没有任何代码重复,并尽可能遵守 OOP 法则。
更详细地说,我正在尝试使用 Lucene 制作一个搜索引擎。卢森
使用许多索引。我已经实现了一个简单的结构,其中不同的索引对象继承父类的方法。问题是,无论在该父类中实现什么方法,它都会自动可供所有子类使用。我想为用户提供选项,以确定他是否想进行短语搜索、术语搜索或任何其他可用于that 特定索引的内容。问题是,例如,某些索引不应提供进行短语搜索的选项。
最初的想法
我想过实现一些接近复合模式的东西,
正如 GoF 所描述的那样。我会将搜索操作(例如术语搜索、短语搜索)实现为实现某些 Component 类的原始操作,然后将这些原始对象添加到 Composite 对象中。 Composite 对象将实现与基元相同的 Component 类。
public abstract class Index {
public Index(String indexPath) {
// Constructor using the information provided by the subclass
}
public void phraseSearch(...) {
// Do the operation
}
public void termSearch(...) {
// Do the operation
}
public void categorySearch(...) {
// Do the operation
}
}
public class ReviewIndex extends Index {
public ReviewIndex() {
super("./review_index/");
}
}
public class TipIndex extends Index {
public TipIndex() {
super("./tip_index/");
}
}
预期结果
ReviewIndex
类不应该能够执行类别搜索,但可以
能够执行 phraseSearch 和 termSearch。分别是TipIndex
类
应该能够执行一些父类方法。
最后的想法
我知道在我的解决方案中没有代码重复,但是 每次创建新索引对象时都会生成无用的方法。 提前谢谢大家!
附言如果您认为复合 模式是可行的方法,那么您实际上会以哪种方式将基本对象添加到复合类中,以及在需要时以哪种方式调用它们?
最佳答案
在父类(super class)中定义的所有方法都可以在派生类中使用,但是对于 Java 8,您可以通过在接口(interface)中使用默认方法来获得类似的东西。因此,您可以实现四个接口(interface),而不是一个包含所有可能方法的抽象类
public interface Searchable {
public String getIndexPath();
}
public interface PhraseSearchable extends Searchable {
public default void phraseSearch() {
String indexPath = getIndexPath();
// do the search
}
}
public interface TermSearchable extends Searchable {
public default void termSearch() {
String indexPath = getIndexPath();
// do the search
}
}
public interface CategorySearchable extends Searchable {
public default void categorySearch() {
String indexPath = getIndexPath();
// do the search
}
}
为了避免重复代码,你可以创建一个抽象类
public abstract class AbstractSearchable implements Searchable {
private String indexPath;
public AbstractSearchable(String indexPath) {
this.indexPath = indexPath;
}
// other methods that might be useful
}
然后您的实际类可以实现相应的接口(interface)
public class ReviewIndex extends AbstractSearchable implements CategorySearchable {
public ReviewIndex() {
super("./review_index/");
}
}
public class TipIndex extends AbstractSearchable implements PhraseSearchable, TermSearchable {
public ReviewIndex() {
super("./review_index/");
}
}
这是否可能在很大程度上取决于搜索方法的实际实现。接口(interface)不能包含任何成员等,因此这些方法必须能够自行运行(就像不使用类的任何静态成员的静态方法)。您可以通过向 Searchable
接口(interface)添加更多方法来解决此问题,这些方法提供数据并在抽象类中执行实现,但这可能会将内部内容公开给公众,因为接口(interface)中的所有声明方法是公开的。
关于java - 有没有一种特定的方法可以将父类(super class)的某些功能赋予某个子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56872204/