我如何在这里使用多态来改进我的代码?

时间:2012-09-30 23:13:59

标签: java polymorphism

我已经阅读过,而不是使用instanceofgetClass方法来实现多态,因为它是更好的面向对象的实践。

如果我的程序如下所示:

Piece
SlowPiece extends Piece,
FastPiece extends Piece,
SlowFlexible extends SlowPiece,
FastFlexible extends FastPiece

我有以下规则:SlowPiece's can only move one space, and FastPiece's as many as they'd like.

我如何使用polymorphism来确保如果我移动像Piece piece1 = new SlowPiece();那样的棋子,那么它不会被移动多于一个?

我有一个游戏板课,它应该可以移动它,但我不知道如何阻止它移动一个不超过1的SlowPiece没有代码嗅探。

基本上,我了解多态性如何说,列出事物​​,但实际上与它们交互,我不知道如何正确使用它。

3 个答案:

答案 0 :(得分:4)

使Piece抽象,并将抽象方法move()添加到Piece(您也可以使用界面)。以不同的方式实施move()SlowPiece仅移动1个点,等等。)

public abstract class Piece {
    public abstract void move();
}

public class SlowPiece extends Piece {
    public void move() {
        System.out.println("moving a slow piece");
    }
}

public class FastPiece extends Piece {
    public void move() {
        System.out.println("moving a fast piece");
    }
}

Piece f = new FastPiece();
f.move();       

Piece s = new SlowPiece();
s.move();

在这里,move()具有所有移动逻辑;您甚至可以使用一些重载来允许移动变化(例如将N / S / W / E作为参数等)。

答案 1 :(得分:3)

作为对这个问题的另一个考虑,让我们理解基本的整体概念。

  • Piece可以move()
  • 某些类型的Piece move()与其他类型的方式不同。

可以将Piece声明为接口,让所有其他Piece实现此功能。这样,您保证每个Piece都有move(),并且还强制您确保每个move()都是不同的,具体取决于{{ 1}}。

答案 2 :(得分:1)

不仅仅是多态,你应该考虑责任。

你“登上”课程应该像

那样
piece.move();

这件作品应该知道如何移动。 因此,如果你喜欢骰子,你可以将数字传递给移动方法,然后按行动

piece.move(moves);

编辑:

棋盘应该管理动作,所以让move方法返回棋子所做步骤的int。运动应该从另一个班级管理,如董事会,而不是从作品本身。

我建议你写一本关于OO分析的非常有趣的书:Craig Larman的“应用uml和模式”。它还包含了作为垄断的棋盘游戏的分步示例!