1

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

如果我的程序如下所示:

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。

基本上,我知道多态性对于列举事物是多么的棒,但实际上与它们交互时,我不知道如何正确使用它。

4

3 回答 3

4

制作Piece抽象并添加抽象方法move()Piece您也可以使用界面)。以不同的方式实施move()(aSlowPiece仅移动 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 作为参数等)。

于 2012-09-30T23:22:50.633 回答
3

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

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

可以声明Piece为接口,并让所有其他Pieces 实现这一点。这样,您保证每个Piece都有一个move(),并且还强制您确保每个move()都是不同的,具体取决于Piece.

于 2012-09-30T23:25:23.130 回答
1

除了多态性之外,您可能还应该考虑责任。

您的“董事会”课程应该做类似的事情

piece.move();

并且这件作品应该知道如何移动。因此,如果你有一个骰子,你可以将数字传递给 move 方法,然后作为

piece.move(moves);

编辑:

棋盘应该管理这些动作,所以让 move 方法返回一个 int 步数。运动应该从另一个类来管理,比如板,而不是从作品本身。

我向您推荐一本关于 OO 分析的非常有趣的书:Craig Larman 的“Applying uml and patterns”。它还包含作为大富翁的棋盘游戏的分步示例!

于 2012-09-30T23:19:40.680 回答