簡體   English   中英

覆蓋java中的擴展數組大小

[英]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);
    }
}

我認為您沒有充分利用繼承的潛力 :-) 。 您正在CellLargeCell中聲明cellNumberPrisoners[]數組。 您可以簡單地將其標記為受保護,讓它們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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM