我想知道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){...}
}
你能否拥有一种既不需要重新声明任何方法的东西呢?
答案 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类的私人引用。