Java 抽象类中应该包含什么?
我正在完成一个战舰项目。但是所有的东西都在一个班级里。我想让它更面向对象 建议我使用:Cell(抽象类),然后Water、Misses、ShipSection作为子类。我应该在单元抽象类中包括什么?什么样的方法,构造函数。如何在“水”课中使用它们Java 抽象类中应该包含什么?,java,inheritance,polymorphism,abstract-class,Java,Inheritance,Polymorphism,Abstract Class,我正在完成一个战舰项目。但是所有的东西都在一个班级里。我想让它更面向对象 建议我使用:Cell(抽象类),然后Water、Misses、ShipSection作为子类。我应该在单元抽象类中包括什么?什么样的方法,构造函数。如何在“水”课中使用它们 谢谢你提供的字段,想想每个类的共同点。如果扩展抽象类,请确保调用super。对于抽象方法,请考虑每个子类中必需的方法。并使构造函数初始化字段。我提供的例子很简单。我还想为抽象类中的字段添加“get”方法(如果有的话) public class Wate
谢谢你提供的字段,想想每个类的共同点。如果扩展抽象类,请确保调用
super
。对于抽象方法,请考虑每个子类中必需的方法。并使构造函数初始化字段。我提供的例子很简单。我还想为抽象类中的字段添加“get”方法(如果有的话)
public class Water extends Cell
{
public Water(/*parameters*/)
{
super(/*parameters*/);
}
@Override
public void speak()
{
System.out.print("I am water.");
}
}
Cell
类应包括所有子体的通用功能,并允许它们实现差异。让我们来找出什么是不同的,什么是共同的
常见的:
- 所有单元格都必须能够绘制
- 所有细胞都必须能够被击打
- 所有的细胞都有状态:它是否被破坏
- 每个单元实现都有自己的绘制方法,具体取决于其状态
- 每个单元实现在罢工时都有自己的反应:是未命中还是命中
Miss
是一个受损的Water
单元,您根本不需要单独的Miss
类。小姐刚被水淹没
因此,您的单元
类可以如下所示:
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
类(正如您所猜测的,Water将在isItHit()方法中返回false
)。现在,例如,如果您有一个类battley
,它包含所有单元格并将它们存储在数组中,那么接下来可以使用:
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();
}
}
这段代码被简化了,只是为了演示一般的想法。如您所见,我们的战地
类对单元的实现一无所知,并将所有单元用作抽象的单元
请记住,这只是类层次结构设计的一个例子,根据您自己的需求,您可以做出不同于此的设计。希望这会有所帮助。您通常从描述您的问题域开始,然后继续开发适合您的问题域的域对象模型(定义了所有关系)。如果你最终得到了一个包含所有内容的类,那么你已经做错了。