我遇到了一种情况,我要扩展给定类的功能,但我不确定最好的解决方法。我开始通过调用功能“向上”,现在已经切换到“向下”,但我发现两者都有问题。让我解释我的意思。首先,“向上”的方法:什么是扩展功能的最佳途径?
public class ParentValidator
{
public void validate() {
// Some code
}
}
public class ChildValidator extends ParentValidator
{
@Override
public void validate() {
super.validate();
// Some code
}
}
public class GrandchildValidator extends ChildValidator
{
@Override
public void validate() {
super.validate();
// Some code
}
}
此功能完美很好,但它要求我永远记得的地方super.validate()在我的方法体或在父类(ES)的逻辑赢得”被执行。另外,由于子类可以实际替换/修改父类中定义的代码,所以这种方式的扩展可以被认为是“不安全的”。这就是我称之为“向上”的方法,因为我正在调用更高级别的方法。
为了应对这些不足,我决定制作ParentValidator.validate()final并让它调用一个不同的方法。下面是我的代码修改为:
public class ParentValidator
{
public final void validate() {
// Some code
subValidate();
}
protected void subValidate() {}
}
public class ChildValidator extends ParentValidator
{
@Override
public final void subValidate() {
// Some code
subSubValidate();
}
protected void subSubValidate() {}
}
public class GrandchildValidator extends ChildValidator
{
@Override
public void subSubBalidate() {
// Some code
subSubSubValidate();
}
protected void subSubSubValidate();
}
这就是我指的是,当我说我打电话向下为每个类调用类上“向下”的继承链的方法。
使用这种方法,我可以保证父类中的逻辑将被执行,我喜欢。但是,它不能很好地扩展。我拥有的继承层越多,它所得到的丑陋。在一个层面上,我认为这是非常优雅的。在两个层面上,它开始看起来以次充好。在三个或更多,这是可怕的。另外,就像我必须记住调用super.validate()作为我的任何孩子的验证方法的第一行一样,现在我必须记住在任何一个的子节点的末尾调用一些“subValidate”方法我的父母的验证方法,所以似乎没有得到任何改善。
有没有更好的方法来做这种类型的扩展,我甚至没有涉及到。这些方法都有一些严重的缺陷,我想知道是否有更好的设计模式可以使用。
这种方法的唯一限制是您必须对被访问的对象进行回调。如果物体“闭合”,那么你必须解决反射(丑陋)。 – 2011-04-29 15:15:24