在我的Java项目中,我有方法addType1AndType2()
,它有窗口,您可以在其中展开列表并从列表中选择对象。创建它非常复杂和耗时,因为必须滚动并且xpath不断变化。这里有两个列表是实际名称,但由于公司专有信息,我只会称它们为Tyep1
和Type2
。
现在我有一个UpdateType1
课程,该课程使用AddType1AndType2
中所有复杂的方法,但与Type2
无关。我可以复制AddType1AndType2
并删除我不需要的所有内容,但这将是复制,并且必须在两个类中重复更改。这违背了继承和可重用性的目的。
我可以制作class UpdateType1 extends AddType1AndType2{}
我做过的事。但是仍然存在像selectType2Value()
这样的方法,它们是继承的,但在子类中是不可能的。
如果我在子类中执行@Override
并将该类声明为私有,则会收到错误,我无法降低子类中的可见性。
知道我能做什么吗?现在我只是放throw new AssertError("Do not use")
,但这似乎有些蹩脚。有没有更好的事情,甚至会在运行时给出编译时错误而不是断言,或者这是最好的方法吗?
答案 0 :(得分:3)
问题是:你的模型错了。
继承更多,而不仅仅是在源代码中添加“A extends B”。 A extends B 表示:A是“B”。
每当你使用B对象时,你应该能够放置一个A对象(称为Liskov substitution principle)。
长话短说:如果B有A不应该有的方法......那么你不应该有A扩展B.
所以真正的答案是:你应该退后一步,仔细决定你真正想要分享的方法。你把它们放在你的基类上。还有别的事情要去。您可能可能会定义其他接口和更多基类,例如
class EnhancedBase extends Base implements AdditionalStuff {
编辑:给出你的评论;最好的方法是:
请记住这是LSP真正有意义的一个很好的例子; - )
答案 1 :(得分:1)
创建接口
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 {
//
}
瞧。
答案 2 :(得分:0)
您可以使用'final'关键字来禁止在子类中扩展方法。
不能在子类中覆盖带有'final'修饰符的方法。