Java 中抽象 class 的继承
Inheritance with abstract class in Java
我想做一个简单的继承实例,网上有很多资料,但我就是看不懂。
public abstract class Board {
private Block [][] board;
/**
* creates and empty board
*/
public Board(){
board = new Block[6][6];
//init board
for(int i = 0; i<board.length ...
}
public abstract place(int x, int y, int type);
public void otherFunction1();
etc..
还有我的childclass
public class StandartBoard extends Board{
public int place(int type, int x, int y) {
bord[i][j].something;
}
问题是,我想使用来自超级 class 的构造函数的初始化以及它的所有其他函数,但我希望 place 函数特定于 StandartBoard。我该如何定义变量 "board",以便我可以使用和修改来自超级 class.
的相同变量
我知道一种方法是使用 sets 和 gets,但我不能直接使用 protected 或其他方式访问它......
如果您使用 protected
修饰符而不是 private
设置 board
,那么您可以像您建议的那样直接访问它。
另一种方法(不一定反映正确的做法),也如您所说,是为它定义一个getter
:
public Block[][] getBoard(){
return board;
}
关于您的评论,是的,protected
具有包范围的访问权限。没有 subclasses-only 修饰符。 Java本来就有这样的修饰语。它是 private protected
,但在 Java 1.0 中被删除了。
如果你想模仿这样的设计,你可以使用 protected
修饰符并强制只有父 class 和它的子 class 在同一个包中。
您已正确阅读来自 Oracle 的 table。
protected
表示可以从同一个包中的anyclass访问该字段(即使不是subclass) 和来自不同包中的子classes。这可能不是您想要的 - 默认访问(无修饰符)可能比使用 protected
更可取。
没有修饰符表示只有个子class可以访问它。
您最好保持 board
private
并确保所有更改它的方法都保持一致的状态。由于数组是 mutable,您可以为单个条目提供 public
getter 而不是整个数组
public Block getBlockAt(int i, int j) {
return board[i][j];
}
这样您就可以从任何地方读取电路板,而无需从任何地方更改电路板。
我想做一个简单的继承实例,网上有很多资料,但我就是看不懂。
public abstract class Board {
private Block [][] board;
/**
* creates and empty board
*/
public Board(){
board = new Block[6][6];
//init board
for(int i = 0; i<board.length ...
}
public abstract place(int x, int y, int type);
public void otherFunction1();
etc..
还有我的childclass
public class StandartBoard extends Board{
public int place(int type, int x, int y) {
bord[i][j].something;
}
问题是,我想使用来自超级 class 的构造函数的初始化以及它的所有其他函数,但我希望 place 函数特定于 StandartBoard。我该如何定义变量 "board",以便我可以使用和修改来自超级 class.
的相同变量我知道一种方法是使用 sets 和 gets,但我不能直接使用 protected 或其他方式访问它......
如果您使用 protected
修饰符而不是 private
设置 board
,那么您可以像您建议的那样直接访问它。
另一种方法(不一定反映正确的做法),也如您所说,是为它定义一个getter
:
public Block[][] getBoard(){
return board;
}
关于您的评论,是的,protected
具有包范围的访问权限。没有 subclasses-only 修饰符。 Java本来就有这样的修饰语。它是 private protected
,但在 Java 1.0 中被删除了。
如果你想模仿这样的设计,你可以使用 protected
修饰符并强制只有父 class 和它的子 class 在同一个包中。
您已正确阅读来自 Oracle 的 table。
protected
表示可以从同一个包中的anyclass访问该字段(即使不是subclass) 和来自不同包中的子classes。这可能不是您想要的 - 默认访问(无修饰符)可能比使用 protected
更可取。
没有修饰符表示只有个子class可以访问它。
您最好保持 board
private
并确保所有更改它的方法都保持一致的状态。由于数组是 mutable,您可以为单个条目提供 public
getter 而不是整个数组
public Block getBlockAt(int i, int j) {
return board[i][j];
}
这样您就可以从任何地方读取电路板,而无需从任何地方更改电路板。