2009-04-11 90 views
6

我想知道是否有在Java语言的特征,其中一个超类的方法将是一个子类的成员无形: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){...} 
} 

如果您想子类,同时保护了它的一些方法,除非你覆盖它们不能在方法更改访问modifyers,你会最终像这个 -

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){...} 
} 

如果不是这样,你可以保持的私有实例,有这样的事情:

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){...} 
} 

你能有什么事情,都需要在你没有重新声明任何方法的方法吗?

回答

10

有一个在Java中没有“非公开”的继承,不像C++的情况。

继承创建一个子类型关系。 B的任何实例也是A的一个实例,并且应该响应相同的消息。如果B的实例明确地不响应A的实例响应的所有消息,则继承将是不适当的。

你最后溶液(B不从A继承)是合适的一个:你没有创建一个子类型关系,只是用一个类型(偷偷)实现另一个。

+0

+1与C++(具有保护和私有继承)进行比较。 – 2009-04-11 22:29:12

+0

当我用来教高级C++时,我用绘制维恩图来显示子类型关系,并显示子类内部和外部所见的内容,发现它非常有效地展示这个概念。但是,我觉得这往往是比它值得的更麻烦。 – Uri 2009-04-11 22:31:31

2

除了在超类中的字段/方法设定为私人的,我不认为有办法解决。

我觉得你最好的最好的是你的第二个选项,其中B类持有私有引用类A.

3

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

如果使用继承,以便B扩展A,你应该能够使用B对象作为一个对象。例如,这将是可能的:

A obj = new B(); 

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

而且没有继承,功能重新定义是不可避免的。