Java继承方法

问题描述 投票:0回答:1

我对如何实现以下情况感到非常困惑。我想这样做:

  1. Integer getScore(String string)

    • ATypology
    • BTypology
  2. boolean isComplete(POJO pojo)

    • ATypology
    • BTypology
    • CTypeology

考虑此:

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个公共条件允许子类覆盖(ATypologyBTypology),而其他条件与TypologyOperation中的全局条件共享让其他子类覆盖(ATypologyBTypologyCTypology

但是问题是在CTypology类中,我需要实现public Integer getScore(String string),但我不想要它,因为它永远不会使用它。有什么办法可以解决这个问题,也许是像访问者模式这样的设计模式?

如果是这样,结构会是什么样?

PS:我改写这个问题,因为我以前有一些印刷错误发布。谢谢。

java inheritance design-patterns
1个回答
0
投票

您当前不是强制来在getScore()上实现CTypology,因为您在TypologyScore的父类中提供了它的实现。

但是,如果您不希望该方法对CTypology的成员完全适用,那么您的案例就是违反SOLID设计原则的Interface Segretation principle的一个很好的例子:

在软件工程领域中,接口隔离原则(ISP)规定不应强迫任何客户依赖它不使用的方法。 Wikipedia

我想您会在第一个引用来源中找到所需的答案,但要总结您的情况及其解决方案:

  • [当前,由于继承,您正在强迫CTypology类实现方法Integer getScore(String string),该方法与该类的目的无关,因此被迫返回null或0。
  • 解决方案是将当前的父类segreate(即拆分)成两个较小的类/接口,每个类/接口为其子级提供确切的功能(即,存在明确的IS / A关系)。然后,两个较小的块可以从相同的父类扩展或实现相同的父接口。

这里是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 

ATypologyBTypology的类层次结构几乎相同,它们只是实现了一个附加接口:

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 
© www.soinside.com 2019 - 2024. All rights reserved.