如何解决覆盖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
构造函数接受一个整数来指定数组的大小,如下所示:
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);
}
}
,
我认为您没有充分利用继承的潜力:-)。您正在同时声明cellNumber
和Prisoners[]
中的Cell
和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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。