我已经阅读过,而不是使用instanceof
和getClass
方法来实现多态,因为它是更好的面向对象的实践。
如果我的程序如下所示:
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没有代码嗅探。
基本上,我了解多态性如何说,列出事物,但实际上与它们交互,我不知道如何正确使用它。
答案 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和模式”。它还包含了作为垄断的棋盘游戏的分步示例!