繁体   English   中英

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

[英]Restricted access on method call using Java polymorphism

我有一些这样的场景:

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);

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

在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); 
 }   

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

所以,你有可能Base class是在不同的包pkg1在你的derived classesclass从正在使用protected method是在同一个包pkg2的differentbase类包pkg1 ..

然后通过上面的属性,你将能够访问派生类的方法,因为它们在同一个包中。但是,因为base class在不同的包中,也不是你的test class的超test class ..它无法被访问..

编辑 : - 好的,这是你可以做的,以防你不能改变Base Class ..

for (BaseClass object : objects) {
    if (object instanceof Child1) {
        ((Child1)object).protectedMethod(other);

    } else if(object instanceof Child2) {
        ((Child1)object).protectedMethod(other);
    }
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM