使用Java多态性限制对方法调用的访问

时间:2012-10-03 13:53:49

标签: java inheritance polymorphism protected

我有一些这样的场景:

public class BaseClass {
    protected void protectedMethod(OtherObject object) {
    ...
    }
} 

public class Child1 extends BaseClass {
    @Override
    protected void protectedMethod(OtherObject object) {
        super.protectedMethod(object);
        // Custom Child1 logic
        ...
    }
}

public class Child2 extends BaseClass {
    @Override
    protected void protectedMethod(OtherObject object) {
        super.protectedMethod(object);
        // Custom Child2 logic
        ...
    }
}

然后当我调用“protectedMethod”迭代一个“BaseClass”对象数组时,编译器给了我受保护的访问错误:

OtherObject other = new OtherObject();

BaseClass[] objects = {
    new Child1(),
    new Child2()
}

for (BaseClass object : objects) {
    object.protectedMethod(other); //this line gives me protected access error
}

但是如果我以不同的非多态方式做同样的事情,它就可以正常工作。

OtherObject other = new OtherObject();

Child1 child1 = new Child1();
Child2 child2 = new Child2();

child1.protectedAccess(other);
child2.protectedAccess(other);

我不明白这两种方式有什么不同。

3 个答案:

答案 0 :(得分:3)

在Java中,''protected''访问限定符不仅允许子类访问,还允许访问同一包中的其他类。

如果您的上一个代码段与Child1和Child2位于同一个包中,则它可以访问Child1和Child2中的受保护方法。

修改

您可以通过在自己的包中引入自己的基类来解决此问题并保持多态性。

 public MyBaseClass extends BaseClass { 
    @Override
    protected void protectedMethod(OtherObject object) {
        super.protectedMethod(object);
    }
 }

 public Child1 extends MyBaseClass { ... }
 public Child2 extends MyBaseClass { ... }

然后使用您自己的基类类型的集合。

 NyBaseClass[] objects = {
    new Child1(),
    new Child2()
 }

 for (MyBaseClass object : objects) {
    object.protectedMethod(other); 
 }   

答案 1 :(得分:1)

具有受保护修饰符的实例变量和方法只能访问either in derived classother class in the same package ..

因此,您的Base class可能位于不同的包 pkg1 中,您的derived classesclass可能位于您使用的{ {1}}位于protected method类包different的同一个包 pkg2 base中。

然后通过上面的属性,你可以访问派生类的方法,因为它们在同一个包中。但是,因为pkg1在不同的包中,也不是你{{1}的超类1}} ..无法访问..

编辑: - 好的,如果您无法更改base class

可以执行以下操作
test class

但是,这会从你的问题中消除所有多态的东西......这只是一种解决方法..

答案 2 :(得分:0)

我会查看此条目: Java Protected Method Accessibility

受保护仅限于同一个包和儿童。如果您需要访问包外的方法,它应该是公共的。