我正在完成一个战舰项目。但一切都在一个班级。我想让它更加面向对象。
建议我使用:Cell(抽象类),然后使用Water,Misses,ShipSection作为子类。我应该在Cell抽象类中包含什么?什么样的方法,建设者。如何在“水”课中使用它们?
谢谢
答案 0 :(得分:0)
对于字段,请考虑每个类的共同点。如果扩展抽象类,请确保调用super
。对于抽象方法,请考虑每个子类中必需的方法。并使构造函数初始化字段。我提供的例子很简单。如果有的话,我还会为抽象类中的字段添加“get”方法。
public class Water extends Cell
{
public Water(/*parameters*/)
{
super(/*parameters*/);
}
@Override
public void speak()
{
System.out.print("I am water.");
}
}
答案 1 :(得分:0)
Cell
类应包含所有后代的通用功能,并让它们实现差异。让我们找出不同的东西和常见的东西。
普通的:
不同:
在实施过程中,您可以找到常见功能和不同功能的其他示例。
顺便说一句,如果我们分析它,结果表明单元格应该根据其状态(受到影响或不受影响)自行绘制。由于Miss
是受影响的Water
单元格,因此您根本不需要单独的Miss
课程。小姐刚好受了水的打击。
因此,您的Cell
课程可能如下所示:
public abstract class Cell{
private boolean isStricken = false;
public void draw(){
if(isStricken){
drawStricken();
}else{
drawNotStricken();
}
}
public boolen strike(){
isStricken = true;
return isItHit();
}
protected abstract void drawNotStricken();
protected abstract void drawStricken();
protected abstract boolean isItHit();
}
ShipSection
只会实现差异:
public class ShipSection extends Cell{
@Override
protected void drawNotStricken(){
//draw section
}
@Override
protected void drawStricken(){
//draw section in fire
}
@Override
protected boolean isItHit(){
return true
}
}
同样,您可以实施Water
课程(正如您所猜测的,水会在false
方法中返回isItHit()
)。现在,例如,如果您有类BattleField
,它包含所有单元格并将它们存储在数组中,则可以使用下一步:
public class BattleField{
Cell[][] cellArray = new Cell[rowCount][colCount] ;
....
public void draw(){
for(Cell[]row : cellArray){
for(Cell cell : row){
cell.draw();
}
}
}
public boolean strike(int row, int col){
Cell cell = cellArray[row][col];
return cell.strike();
}
}
此代码已简化,仅用于演示一般概念。如您所见,我们的BattleField
类对单元格的实现一无所知,并将所有单元格用作抽象Cell
。
请记住,这只是类层次结构设计的一个例子,根据您可以自己制作的要求,与此不同。希望这会有所帮助。