在我的java项目中,我有一个方法addType1AndType2()
,它的windows可以在其中扩展列表并从列表中选择对象。创建非常复杂且耗时,因为必须滚动事物,并且XPath的变化不断变化。其中有两个列表是实际的名称,但是由于公司专有信息,我只会称它们为Tyep1
和Type2
。
现在,我有一个UpdateType1
类,该类使用AddType1AndType2
中的所有复杂方法,但与Type2
没有任何关系。我可以复制AddType1AndType2
并切割我不需要的所有内容,但这将是复制的,并且必须在两个课程中重复更改。这打败了继承和可重复性的目的。
我可以做一个我已经完成的class UpdateType1 extends AddType1AndType2{}
。但是仍然有类似selectType2Value()
的方法在子类中继承但不可能。
如果我做@Override
并将该类声明为子类中的私人,则会发现一个错误,我无法降低子类中的可见性。
知道我能做什么?现在,我只是放了一个throw new AssertError("Do not use")
,但这似乎很la脚。有更好的事情要做,甚至会出现编译时错误而不是在运行时断言,还是最好的方法?
事实是:您的模型是错误的。
继承是更多的,而不仅仅是将" A扩展B"放在源代码中。 a扩展b 表示:a"是" b。
每当您使用B对象时,都应该能够将A对象放置(称为Liskov替代原理)。
长话短说:如果b的方法不应该有...那么您就不应该b。
因此,真正的答案是:您应该退后一步,仔细确定您真正想共享的方法。您将这些放在基础课上。其他任何事情都必须走。您可能会定义其他接口和更多的基类,例如
class EnhancedBase extends Base implements AdditionalStuff {
编辑:给出您的评论;最好的方法是:
- 创建表示应该融合在一起的各种方法组的接口
- 而不是扩展该基类,使用 COMPOINT :创建一个新的类A,该类别使用一些B对象以实现一个/这些新接口中的更多。
并记住这是一个很好的例子,为什么LSP真正有意义; - )
创建接口
public interface IAddType1 {... /* methods signtatures to add Type1 */}
public interface IAddType2 {... /* methods signtatures to add Type2 */}
public interface IUpdateType1 {... /* methods signtatures to update Type1 */}
然后,您在AddType1AndType2
的当前代码将成为基本帮手类:
public abstract class BaseOperationsType1AndType2{
//code originally at AddType1AndType2: methods that add Type1 and Type2
}
那么您的新AddType1AndType2
类将是:
public class AddType1AndType2
extends BaseOperationsType1AndType2,
implements IAddType1 , IAddType2 {
//nothing special.
}
,您的新UpdateType1
可以定义为
public class UpdateType1
extends BaseOperationsType1AndType2
implements IUpdateType1 {
//
}
voila。
您可以使用'最终'关键字禁止在子类中扩展方法。
具有"最终"修饰符的方法不能在子类中覆盖。