Java继承和访问修饰符
我正在尝试创建一个类系统,如下所示:Java继承和访问修饰符,java,inheritance,protected,access-modifiers,Java,Inheritance,Protected,Access Modifiers,我正在尝试创建一个类系统,如下所示: public class Matrix { private int[][] m; public Matrix(int rows, int cols) { //constructor } public int get(int row, int col) { return m[row][col]; } } public class Vector extends Matrix { p
public class Matrix {
private int[][] m;
public Matrix(int rows, int cols) {
//constructor
}
public int get(int row, int col) {
return m[row][col];
}
}
public class Vector extends Matrix {
public Vector() {
//constructor
}
public int get(int index) {
return super.get(0, index);
}
}
我希望Matrix.get(row,col)函数是公共的,但我不希望它通过Vector类是公共的。我不希望这成为可能:
Vector v = new Vector();
int x = v.get(1, 1);
私有访问修饰符对我没有帮助,因为它不能使方法在Matrix类之外可用(除了它的继承者)
关于如何实现它有什么想法吗?不幸的是,这是不可能的,因为如果一个类继承了另一个类,则必须能够调用继承的类的所有方法 如果您不想这样做,因为索引将超出范围,那么将
getRows()
和getColumns()
方法添加到矩阵中,任何拥有向量实例的人都将检查以确保在调用get(int row,int col)时
它不会抛出索引越界异常。怎么样
public class Vector extends Matrix {
public Vector(int cols) {
super(0, cols);
}
public int get(int index) {
return get(0, index);
}
@Override
public int get(int row, int col) {
if (row > 0) {throw new IllegalArgumentException("row != 0");
return super.get(0, index);
}
}
?在这种情况下,您可以考虑使用组合而不是继承 Vector类将成为:
public class Vector {
private Matrix matrix;
public Vector() {
matrix = new Matrix();
}
public int get(int index) {
return matrix.get(0, index);
}
}
另一个解决方案是反转继承:
public class Matrix extends Vector{
private int[][] m;
public Matrix(int rows, int cols) {
super(0);
}
public int get(int row, int col) {
return m[row][col];
}
@Override
public int get(int index) {
return m[0][index];
}
}
public class Vector {
private int[] v;
public Vector(int length) {
v = new int[length];
}
public int get(int index) {
return v[index];
}
}
在这种情况下,
向量
不应该扩展矩阵
。你为什么想要实现这样的目标?听起来像是一个。受保护;)怎么样。试试看,这是不可能的。但是您可以做一件事,您可以覆盖Vector
类中的get方法并弃用它@Override@Deprecated/***不要使用方法*/public int-get(int-row,int-col){return-1;}
@Sagiv您能告诉我们您不希望Vector
的对象看不到父对象的get
方法的原因吗?我的意思是,您试图解决的具体问题是什么?您可以尝试更改包结构并使用默认访问修饰符。