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

时间:2016-03-09 05:31:51

标签: java inheritance polymorphism abstract-class

我正在完成一个战舰项目。但一切都在一个班级。我想让它更加面向对象。

建议我使用:Cell(抽象类),然后使用Water,Misses,ShipSection作为子类。我应该在Cell抽象类中包含什么?什么样的方法,建设者。如何在“水”课中使用它们?

谢谢

2 个答案:

答案 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

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