java - 有没有一种特定的方法可以将父类(super class)的某些功能赋予某个子类?

标签 java inheritance design-patterns polymorphism

问题

我正在尝试创建一个应用程序,其中的对象类可以实现一些 来自可用操作总池的操作。最终目标是没有任何代码重复,并尽可能遵守 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/

相关文章:

c++ - 关于异常继承语法的一个问题

java - 单例模式在我的 Java 代码中不返回相同的对象

c# - 尝试使用 new Func<int, int, int> 理解维基百科策略模式示例

java - JDBCRealm 中的 "User Expired Password"

java - Android:将外部项目包名称添加到布局xml中?

java - 通过 java 中的继承为不同的实现重用算法逻辑

c++ - 从未知派生类调用接口(interface)函数(多重继承)

api - 如何包含对 raml 资源的常见响应

java - 查询对象模式(设计模式)

java - jOOQ 代码生成 : forcedType