Java中受保护的类结构?

时间:2009-04-11 22:18:43

标签: java oop class inheritance

我想知道Java中是否存在一种语言特性,其中超类的方法对于子类的成员是不可见的:

 public class Subclass extends protected Superclass

或者其他什么。我举个例子。

这是你的超类。

public class A{
    public String getA(){...}
    public String getB(){...}
    public String getC(){...}
    public void setA(String a){...}
    public void setB(String b){...}
    public void setC(String c){...}
}

如果您希望在保护其某些方法的同时继承A,并且除非覆盖它们,否则无法在方法中更改访问修改器,您最终会得到类似的内容 -

public class B extends A{
    private String getA(){return super.getA();}
    private String getB(){return super.getB();}//These four methods have
    private void setA(String a){super.setA(a);}//to be redeclared.
    private void setB(String b){super.setB(b);}

    public String getC(){return super.getC();}//These two methods can be
    public void setC(String c){super.setC(c);}//removed.
    public String getD(){...}
    public void setD(String d){...}
}

或者您可以保留A的私有实例并具有以下内容:

public class B{

    private A obj;

    private String getA(){return obj.getA();}
    private String getB(){return obj.getB();}//These four methods can also
    private void setA(String a){obj.setA(a);}//be removed.
    private void setB(String b){obj.setB(b);}

    public String getC(){return obj.getC();}//These two methods are
    public void setC(String c){obj.setC(c);}//redeclared.
    public String getD(){...}
    public void setD(String d){...}
}

你能否拥有一种既不需要重新声明任何方法的东西呢?

3 个答案:

答案 0 :(得分:10)

与C ++中的情况不同,Java中没有“非公共”继承。

继承创建子类型关系。 B的任何实例也是A的实例,并且应该响应相同的消息。如果B的实例显然不响应A实例响应的所有消息,那么继承将是不合适的。

你的最后一个解决方案(B不是从A继承)是合适的:你不创建一个子类型关系,只使用一种类型(秘密地)实现另一种。

答案 1 :(得分:3)

我不认为这是或应该是可能的。

如果使用继承使B扩展A,则应该能够将B对象用作A对象。例如,这是可能的:

A obj = new B();

现在程序无法知道你不能调用A的一些公共方法。

没有继承,重新定义函数是不可避免的。

答案 2 :(得分:2)

除了在超类中将字段/方法设置为私有之外,我认为没有办法解决这个问题。

我认为你最好的选择将是你的第二选择,其中B类拥有对A类的私人引用。