将父类成员限制为其直接子类

假设我在Java中有四个具有给定层次结构的类。

class A {}
class B extends A {} 
class C extends B {} 
class D extends C {} 

根据我的理解,类 A 的所有可访问字段都将通过继承提供给其所有子类。现在,如果我希望类 A 的几个字段仅对类 B 可用,该怎么办?

在java中有什么方法可以让我将父类的某些字段限制为其直接子类吗?


答案 1

并不是说我会在生产中做这样的事情,但是在这里你去:

class A {
    private int a = 1;

    public int getA() {
        if (getClass().equals(A.class) || 
            getClass().getSuperclass().equals(A.class)) {
            return a;
        } else {
            throw new UnsupportedOperationException("hahaha");
        }
    }        

    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        C c = new C();
        System.out.println(a.getA());
        System.out.println(b.getA());
        System.out.println(c.getA());
    }
}

class B extends A {}

class C extends B {}

因此,基本上您可以使用此技巧仅允许所需的类(使用黑名单或白名单方法) - 调用.getA()

输出:

1
1
Exception in thread "main" java.lang.IllegalStateException: hahaha
    ...

答案 2

将父类成员限制为其直接子类,为此,

Java 提供了访问修饰符,其中,您可以访问类成员:protected

1) 课堂内

2) 包装内和

3) 软件包外仅由子类提供。

如果要将数据成员限制为直接子类,则可以执行以下操作:

声明一个类,如下所示:

package com.firstpackage;

Class A{
 protected int a;
}

现在在另一个包中使用子类,如下所示:

package com.secondpackage;

Class B extends A{
 //Access data members of class A
}

现在,如果您从 中声明,in 和它们,那么这两个类 () 不是的直接子级,当然也不在实现的同一包中。因此,类 A 的数据成员在 中不可访问。Class C and Dpackage com.secondpackage;extendsClass BClass C and DClass AClass AClass C and D


推荐