2016-03-07 96 views
0

我在Java中有一个设计问题。我有Java设计问题:继承多个抽象类

  • 一个抽象类Feature其表示特征(机器学习),和
  • 一个抽象类NormalizableFeature继承和表示可以被归一化的特征。

具体功能可以是FeatureNormalizable的实例。

我想介绍一个名为Probablity的抽象类,它继承自Feature并表示可以进行某种概率计算的特征。

实际特征应该是Feature(不可规范化且不可能)的实例,或者它应该是Normalizable或​​或两者的实例。

现在的问题是,实际功能无法从Normalizable和​​继承。

我该如何解决这个问题?我认为使用接口不是解决方案,因为所有提到的类都包含实现。

+0

使用接口扩展是来我的心,如果你不能设计一个类结构的唯一解决方案。否则,您可能会转到像策略这样的设计模式,其中所使用的算法/实现的类型必须在运行时确定。 –

+1

它有助于你的班级澄清你的意图。例如,将'Feature'的子类称为'Probability'是没有意义的。最好称它为'ProbabilisticFeature'。为了进一步帮助你,你能找出一些在每个类上都有适当名字的方法吗? –

+0

@ImeshaSudasingha但接口不能有实际的实现。所以我必须在我的实际类中实现实现(实现接口),这会创建大量重复的代码。 – BlackHawk

回答

1

您可以创建一个类NormalizablePrbability.java使用Composition并有Probability.javaNormalize.java在新创建的NormalizablePrbability.java类字段。您可以从Feature.java扩展NormalizablePrbability.java并覆盖方法,并在每种方法中可以提供Probability.javaNormalize.java的组合功能。现在

你可以有你的具体类可以从Feature.javaNormalize.javaProbability.javaNormalizablePrbability.java

+1

感谢您的回答。你的假设是不正确的(我的解释不太好)。 Probability.java继承自Feature.java,但不是来自Normalizable.java。一个对象可以是Normalizable,Probability或两者的子类型。问题是什么时候该类应该是两者的子类型。 – BlackHawk

+0

@BlackHawk我很抱歉理解你的问题,我已经在我的答案中作出了更正,希望它有帮助。 –