//cls_a is defined by system framework, so we cannot change its definition
public class cls_a {
public void method_a();
}
//I add a new cls_b implemenation and would like to
//add a new method_a(int) function
//and prevent client side to access cls_a.method_a()
public class cls_b extends cls_a {
public void method_a(int a) {
//do something for a
method_a();
}
}
//client side
cls_b b = new cls_b();
b.method_a(2); //it's okay
b.method_a(); //should give something error when compiling code
我想设计cls_b
,这样当客户端调用b.method_a()
时,Java编译器会给出一个错误。有人知道用Java怎么做吗?
发布于 2013-01-20 05:11:15
你不能这样做,因为你不能降低继承方法的可见性(例如,如果它是公共的,你就不能把它变成私有的)。
Why can't you reduce the visibility of a method in a Java subclass?解释了为什么会这样。
发布于 2013-01-20 05:12:23
一旦您将其公开,那么它的范围就可以在整个项目中使用。无法使公共函数对特定类隐藏
更新:我刚刚又读了一遍你的问题。我认为您希望其他开发人员在从b调用method_a()时会得到异常。如果这是您想要的,那么您可以尝试
package com.test;
public class ClassA {
public static void main (String args[]) {
ClassB b = new ClassB();
b.print();
}
}
class ClassC {
public void print() {
System.out.println("printA");
}
}
class ClassB extends ClassC {
public void print() {
try {
throw new Exception("This method is dead");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void print(int i) {
System.out.println(i);
}
}
发布于 2013-01-20 05:17:12
您可以这样做:为客户端公开一个包装类。
public class cls_a_Wrapper {
private cls_a a;
cls_a_Wrapper(){
a = new cls_a();
}
//methods
public void method_a_wrapper(){
a.method_a();
}
}
public class cls_b extends cls_a_Wrapper {
public void method_a_wrapper(int a) {
//delegate to wrapper class method if its allowed
method_a_wrapper();
}
}
因此,现在您的客户端应该使用cls_a_Wrapper类,而不是cls_a。
所以现在你可以控制是否要调用基类的公共方法。这是适配器设计模式。
如果不想调用公共方法,则为 :
class.
记住:对于客户端,原始类不存在。客户端应将包装器类视为基类。
https://stackoverflow.com/questions/14421848
复制