首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的继承。两个无法访问对方越权方法的孩子

Java中的继承。两个无法访问对方越权方法的孩子
EN

Stack Overflow用户
提问于 2018-12-09 22:49:06
回答 1查看 139关注 0票数 0

假设我有class/interface A,也就是class Bclass Cextended/implementedClass/interface A包含method X。是否有一种方法可以让method X不带身体(X();),因此它必须由class Bclass C实现,但不允许class Bclass C (或任何其他类(可能是class/interface A) )访问对方的method X

代码语言:javascript
复制
? class/interface A {
  ? X();
}

? class B extends/implements class/interface A {
  @Override
  ? X() {
    ...code...
  }
}

? class C extends/implements class/interface A {
  @Override
  ? X() {
    ...code...
  }
}

我不确定上面用问号表示的修饰符,也不确定A应该是类还是接口。

编辑:--另外,类B和C的实例是在class D中创建的。class Cclass D中的实例是以class D中的class B实例作为参数来构造的,它被设置为一个类变量,这个class C实例不断地从中获取数据。我不希望class C的这个实例能够调用它的类变量对象Bmethod X

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-10 02:38:12

如果类B和C不存在于类A的同一个包中,则可以将X保护抽象为A。

这意味着您需要使A成为一个抽象类,而不是接口,因为接口方法总是公开的。

所以你会得到A:

代码语言:javascript
复制
package a.b.c

public abstract class A {
    protected abstract Foo X();
}

在新包中创建B

代码语言:javascript
复制
package a.b.d

public class B extends a.b.c.A {
    // ... implement X
}

在不同的包中创建C

代码语言:javascript
复制
package a.b.e

public class C extends a.b.c.A {
    // ... implement X
}

现在,如果您希望类D能够调用X,则需要将D放在与A(即a.b.c )相同的包中,但您需要将每个包转换为A,以便调用X

代码语言:javascript
复制
package a.b.c

public class D {
    public D(a.b.d.B b, a.b.e.C c) {
        // ... call ((A)b).X() or ((A)c).X()
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53697464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档