Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类中应该包含什么?_Java_Inheritance_Polymorphism_Abstract Class - Fatal编程技术网

Java 抽象类中应该包含什么?

Java 抽象类中应该包含什么?,java,inheritance,polymorphism,abstract-class,Java,Inheritance,Polymorphism,Abstract Class,我正在完成一个战舰项目。但是所有的东西都在一个班级里。我想让它更面向对象 建议我使用:Cell(抽象类),然后Water、Misses、ShipSection作为子类。我应该在单元抽象类中包括什么?什么样的方法,构造函数。如何在“水”课中使用它们 谢谢你提供的字段,想想每个类的共同点。如果扩展抽象类,请确保调用super。对于抽象方法,请考虑每个子类中必需的方法。并使构造函数初始化字段。我提供的例子很简单。我还想为抽象类中的字段添加“get”方法(如果有的话) public class Wate

我正在完成一个战舰项目。但是所有的东西都在一个班级里。我想让它更面向对象

建议我使用:Cell(抽象类),然后Water、Misses、ShipSection作为子类。我应该在单元抽象类中包括什么?什么样的方法,构造函数。如何在“水”课中使用它们


谢谢你提供的字段,想想每个类的共同点。如果扩展抽象类,请确保调用
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();
    }
}
这段代码被简化了,只是为了演示一般的想法。如您所见,我们的
战地
类对单元的实现一无所知,并将所有单元用作抽象的
单元


请记住,这只是类层次结构设计的一个例子,根据您自己的需求,您可以做出不同于此的设计。希望这会有所帮助。

您通常从描述您的问题域开始,然后继续开发适合您的问题域的域对象模型(定义了所有关系)。如果你最终得到了一个包含所有内容的类,那么你已经做错了。