[英]Override extended array size in java
我有一個類LargeCell
,它是Cell
類的擴展。 我想在具有不同數組大小的兩個類中對固定數組使用相同的名稱。 在單元類中,我希望大小為 1,而在 LargeCell 類中,我希望大小為 2。當我嘗試將囚犯添加到 LargeCell 而不是將囚犯添加到 LargeCell 時,他會被添加到 Cell 類中的數組中。 我可以覆蓋addPrisonerToCell()
方法,但它對我來說似乎不是最好的解決方案,因為它是從其他類復制粘貼的。 有什么辦法可以使方法在正確的類上工作而不覆蓋它們?
public class Cell {
private int cellNumber;
private Prisoner[] prisoners;
public Cell(int cellNumber){
this.cellNumber=cellNumber;
this.prisoners=new Prisoner[1];
}
public boolean addPrisonerToCell(Prisoner prisoner) {
for(int i=0; i<this.prisoners.length;i++){
if(this.prisoners[i]==null){
this.prisoners[i]=prisoner;
return true;
}
}
return false;
}}
public class LargeCell extends Cell {
private Prisoner[] prisoners;
public LargeCell(int cellNumber) {
super(cellNumber);
this.prisoners = new Prisoner[2];
}
@Override
public boolean addPrisonerToCell(Prisoner prisoner) {
for(int i=0; i<this.prisoners.length;i++){
if(this.prisoners[i]==null){
this.prisoners[i]=prisoner;
return true;
}
}
return false;
}}
通過聲明另一個prisoners
字段,您只是在超類中隱藏該字段。 您可以讓Cell
構造函數接受一個 int 來指定數組的大小,如下所示:
public class Cell {
private int cellNumber;
private Prisoner[] prisoners;
public Cell(int cellNumber){
this(cellNumber, 1);
}
protected Cell(int cellNumber, int size){//only accessible by subclasses
this.cellNumber = cellNumber;
this.prisoners = new Prisoner[size];
}
public boolean addPrisonerToCell(Prisoner prisoner) {
for(int i=0; i<this.prisoners.length;i++){
if(this.prisoners[i]==null){
this.prisoners[i]=prisoner;
return true;
}
}
return false;
}
}
public class LargeCell extends Cell {
public LargeCell(int cellNumber) {
super(cellNumber, 2);
}
}
我認為您沒有充分利用繼承的潛力 :-) 。 您正在Cell
和LargeCell
中聲明cellNumber
和Prisoners[]
數組。 您可以簡單地將其標記為受保護,讓它們LargeCell
類(在本例中為LargeCell
)重用。 為了覆蓋數組的大小,我引入了一個名為getCellSize()
的方法,它將在構造函數中調用以進行數組初始化:
public class Cell {
protected int cellNumber;
protected Prisoner[] prisoners;
public Cell(int cellNumber){
this.cellNumber=cellNumber;
this.prisoners=new Prisoner[getCellSize()];
}
public int getCellSize() { return 1; }
public boolean addPrisonerToCell(Prisoner prisoner) {
for(int i=0; i<this.prisoners.length;i++){
if(this.prisoners[i]==null){
this.prisoners[i]=prisoner;
return true;
}
}
return false;
}
}
您可以簡單地在LargeCell
覆蓋此方法以返回不同的值:
public class LargeCell extends Cell {
public LargeCell(int cellNumber) {
super(cellNumber);
}
@Override
public int getCellSize() { return 2; }
@Override
public boolean addPrisonerToCell(Prisoner prisoner) {
for(int i=0; i<this.prisoners.length;i++){
if(this.prisoners[i]==null){
this.prisoners[i]=prisoner;
return true;
}
}
return false;
}
}
我是這樣測試的:
public static void main(String[] args) {
Cell cell = new Cell(11);
System.out.println("Adding A to cell ..." + (cell.addPrisonerToCell(new Prisoner("A")) ? "Success" : "Failed"));
System.out.println("Adding B to cell ..." + (cell.addPrisonerToCell(new Prisoner("B")) ? "Success" : "Failed"));
LargeCell largeCell = new LargeCell(12);
System.out.println("Adding C to large cell ..." + (largeCell.addPrisonerToCell(new Prisoner("C")) ? "Success" : "Failed"));
System.out.println("Adding D to large cell ..." + (largeCell.addPrisonerToCell(new Prisoner("D")) ? "Success" : "Failed"));
System.out.println("Adding E to large cell ..." + (largeCell.addPrisonerToCell(new Prisoner("E")) ? "Success" : "Failed"));
}
這將返回以下輸出:
Adding A to cell ...Success
Adding B to cell ...Failed
Adding C to large cell ...Success
Adding D to large cell ...Success
Adding E to large cell ...Failed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.