仅限父类成员到其直接子类

时间:2017-11-23 04:41:09

标签: java inheritance access-modifiers restriction

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

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

根据我的理解,A类的所有可访问字段都可以通过继承用于其所有子类。现在,如果我希望A类的几个字段只能用于B类,那该怎么办呢。

在java中有什么办法可以限制父类的某些字段到它的直接子类吗?

5 个答案:

答案 0 :(得分:9)

不是说我会在制作中做这样的事情,但是你去了:

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
    ...

答案 1 :(得分:4)

  

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

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
}

现在,如果您在Class C and D中声明package com.secondpackage;,从extends声明Class B,那么这两个类(Class C and D)就不是Class A当然不在Class A实施的同一个包中。因此,Class C and D无法访问A类数据成员。

答案 2 :(得分:3)

这不是正确的课程设计,但如果你真的想这样做,你可以管理这种情况。

同样,您希望将父类成员限制为直接子类以外的其他成员,您可以使用protected访问修饰符并将其他类放在另一个package中。

根据你的例子,

Class AClass B将位于同一个包中,Class C,D将是另一个包。您可以为Class A的成员使用受保护的访问修饰符。

答案 3 :(得分:0)

您可以将所有属性设置为私有,并使用getter访问它们。 然后,您可以控制可见性并覆盖它。

有3个班级的例子:

    class A{
        private String test = "Test123";
        protected String getTest(){return test;};
    }

    class B extends A{
        @Override
        protected String getTest(){return "no";};
    }

    class C extends B{
    } 

这里A类只与B共享测试属性。 B可以使用super.getTest()访问A属性 C无法访问测试。

比检查班级类型更简洁。

答案 4 :(得分:0)

通过OOPS概念: 在继承概念中,类的设计行为对于一个类不能与其他类不同。

要停止将字段继承给子类,请将这些字段设为密闭(即私有)。而且,如果您要求仅直属孩子可以访问这些字段,请将该字段标记为受保护。

如果您需要访问直到最后一个叶子节点子类(在这种情况下,直到D类)的字段,然后将这些字段标记为public。

或者在将类设计为组件时,可以通过类级别的OOPS访问修饰符来限制一个类从另一组件继承。