所以我有一个超类Ghost,在构造函数中有一个来自另一个类Pacman的参数。现在为了创造4种不同类型的幽灵(randy,愚蠢,特蕾西和sue,如果你是pacman),它们有很多相似之处,我正在制作Ghost的子类。在构造函数中,我从标题中得到错误。
一些Ghost.class代码:
public class Ghost extends Actor
{
protected Pacman game;
Randy randy;
Ghost pinky; //totally unsure, but not a matter of question
public Ghost(Pacman game)
{
this.game = game;
这是Randy的子类:
private class Randy extends Ghost {
Actor randy;
public Randy(){
super(game); //here is the error
randy = new Actor();
this.game = game;
这就是我这样做的原因:
public void act()
{
if (pinky instanceof Randy){
moveRandom(); // Randy must move ONLY randomly unlike the other ghosts
}
setSlowDown(2);
code left out here
注意代码是碎片化的。
最后,我问这个问题,因为我找不到动态变量的解决方案。欢迎所有建议。
答案 0 :(得分:1)
首先,我会摆脱兰迪的双重定义。 “Randy”用作Ghost
的成员,也用作类型。如果“Randy”是一种Ghost(每个Randy都是Ghost),请使Ghost
抽象并使用子类。如果“Randy”是“MovementStrategy”,则创建一个新的MovementStrategy
接口和Randy
实现(然后在Ghost
内部设置。
一个Ghost在任何时候都不应该有两个或更多的移动策略;因为,Ghost有一个它没有使用的移动策略,这是Cruft并且完全不受欢迎。
这也可以防止需要“instanceof”来控制你的逻辑,你真的不应该出于多种原因这样做。如果MovementStrategy
返回“下一个方向”,则依靠polymorphisim让“Randy”实例返回下一个方向。 “Instanceof”很好地表明您将与数据类型相关的代码放在数据类型之外,这是反面向对象的编程。
一般来说,最好使用语言的设计选择而不是语言的设计选择,所以不要立即在Java中使用非面向对象的技术,直到有非常 非常令人信服的理由。
---编辑以显示一些代码作为插图---
public Ghost extends Actor {
private Game game;
private MovementStrategy strategy;
private Location location;
public Ghost(Game game, MovementStrategy strategy) {
this.game = game;
this.movementStrategy = strategy;
}
// From Actor, I guess
@Override
public void act() {
if (location == null) {
location = game.addGhost(this);
}
move(movementStrategy.getDirection(game, location));
}
private void move(Direction direction) {
location = game.move(this, direction);
}
}
public interface MovementStrategy {
public Direction getDirection(Game game, Location location);
}
public class Randy implements MovementStrategy {
public Direction getDirection(Game game, Location location) {
return selectRandom(game.getPermittedDirections());
}
}
// constructing a Ghost with a Randy movement strategy
Game game = new Game();
Ghost ghost = new Ghost(game, new Randy());
答案 1 :(得分:0)
您需要将游戏作为参数传递给Randy
的构造函数。