代码之家  ›  专栏  ›  技术社区  ›  dcp

如何调用基类方法?

  •  1
  • dcp  · 技术社区  · 14 年前

    假设我有这样的类声明:

    public abstract class IdentifiableEntity  {
        public boolean validate() {
            return true;
        }
    }
    
    public class PreferenceCategory extends IdentifiableEntity {
        public boolean validate() {
            return true;
        }
    }
    

    现在,假设我已经创建了preferrenceCategory变量,我想调用identifiableEntity.validate()方法, preferenceCategory.validate()方法。

    我本以为我可以用一个强制转换来实现这一点(见下文),但它仍然调用被重写的方法:

    PreferenceCategory cat = new PreferenceCategory();
    
    // this calls PreferenceCategory.validate(), not what I want
    ((IdentifiableEntity)cat).validate(); 
    

    有什么办法吗?

    4 回复  |  直到 12 年前
        1
  •  9
  •   BalusC    14 年前

    你不能。你最好的办法是在 PreferenceCategory 叫超级的 validate() 方法。

    public boolean validateSuper() {
        return super.validate();
    }
    

    但你为什么要这样做?这有点像设计的味道。你可以找到 chain of responsibilty pattern 有趣。

        2
  •  0
  •   meriton    14 年前

    您可以,但只能在子类中:

    public boolean simpleValidate() {
        return super.validate();
    }
    

    如果不想重写,为什么不以不同的方式命名该方法?如果调用方必须能够选择他们调用的方法,则这些方法会执行不同的操作,这些操作应该反映在方法名中。

        3
  •  0
  •   fredcrs    14 年前

    如果强制转换,它仍将使用重写方法。所以你应该这样做…

    public class PreferenceCategory extends IdentifiableEntity {
        public boolean validate() {
            return true;
        }
        public boolean validateSuper(){
            return super.validate();
        }
    }
    

    然后您调用validatesuper,它应该可以工作,bot远不是很好的OO编程,我真的不建议您这样做; 如果需要调用不同的validate,那么只需为该方法指定不同的名称,并在需要时调用它,或者现在调用validate来调用超类方法,而不是像这样重写…

    public class PreferenceCategory extends IdentifiableEntity {
        public boolean validatePreferenceCategory() {
            return true;
        }
    }
    

    你仍然可以从超类调用validade

        4
  •  0
  •   Bill the Lizard    12 年前

    除了在Super .MuleMuleNe()中的子类之外,在Java中没有这样的方法。即使反射也不行。其他语言(如Ruby)可以通过反射来实现。

    http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on