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

Java 我如何在这里使用多态性来改进代码?,java,polymorphism,Java,Polymorphism,我已经阅读了这篇文章,而不是使用instanceof和getClass方法来实现多态性,因为这是更好的面向对象实践 如果我的程序如下所示: Piece SlowPiece extends Piece, FastPiece extends Piece, SlowFlexible extends SlowPiece, FastFlexible extends FastPiece 我有以下规则:SlowPiece只能移动一个空间,FastPiece可以移动任意多个空间 我如何使用多态性来确保如果我移

我已经阅读了这篇文章,而不是使用instanceof和getClass方法来实现多态性,因为这是更好的面向对象实践

如果我的程序如下所示:

Piece
SlowPiece extends Piece,
FastPiece extends Piece,
SlowFlexible extends SlowPiece,
FastFlexible extends FastPiece
我有以下规则:SlowPiece只能移动一个空间,FastPiece可以移动任意多个空间

我如何使用多态性来确保如果我移动的是像Piece piece1=new SlowPiece这样的片段;它不会移动超过一个

我已经为游戏板创建了一个类,它应该能够移动棋子,但我不确定如何阻止它在不进行代码嗅探的情况下移动超过1个慢棋子


基本上,我知道多态性是多么奇妙,比如说,列出一些东西,但实际上与它们交互,我不知道如何正确使用它。

除了多态性,你可能还应该考虑责任

你们班应该做些类似的事情

piece.move();
这件作品应该知道如何移动。 因此,如果你有一个骰子,你可以传递给移动方法的数字,并作为结果

piece.move(moves);
编辑:

板应该管理移动,因此让move方法返回工件所做步骤的int。应该从另一个类(如board)管理移动,而不是从片段本身


我向您推荐一本关于OO分析的非常有趣的书:CraigLarman的《应用uml和模式》。它还包含一个逐步的例子,一个棋盘游戏作为垄断

除了多态性,你可能还应该考虑责任

你们班应该做些类似的事情

piece.move();
这件作品应该知道如何移动。 因此,如果你有一个骰子,你可以传递给移动方法的数字,并作为结果

piece.move(moves);
编辑:

板应该管理移动,因此让move方法返回工件所做步骤的int。应该从另一个类(如board)管理移动,而不是从片段本身

我向您推荐一本关于OO分析的非常有趣的书:CraigLarman的《应用uml和模式》。它还包含一个逐步的例子,一个棋盘游戏作为垄断

将工件抽象化并添加抽象方法移动到工件,您还可以使用一个界面。执行不同的移动,一个慢片段只移动一个点,等等

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作为参数等。

将工件抽象化,并向工件添加抽象方法move您还可以使用一个界面。执行不同的移动,一个慢片段只移动一个点,等等

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作为参数等。

作为这个问题的另一个考虑因素,让我们了解基本的总体概念

一块可以移动。 某些类型的工件以不同的方式移动。
您可以将该块声明为接口,并让所有其他块实现这一点。通过这种方式,您可以保证每个棋子都有一个移动,同时也迫使您确保每个移动都是不同的,这取决于棋子。

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

一块可以移动。 某些类型的工件以不同的方式移动。
您可以将该块声明为接口,并让所有其他块实现这一点。通过这种方式,你可以保证每一个片段都有一个移动,也可以强制你确保每一个移动都是不同的,这取决于片段。

我认为手动分派不会显示任何类型的多态性,但是..在任何情况下,为什么不只是一个int-maximumNumberOfSpaces{..}方法呢?此外,考虑契约子类的接口只是一种共享行为的简单方法。我认为手动调度从来没有显示任何类型的多态性,但是……在任何情况下,为什么不只是int最大值空间{{}方法?另外,考虑契约子类的接口只是一种共享行为的简单方法。如果有其他通用方法,并且阻止您只编写一个David Titarenco的答案已经很好地涵盖了这一方面的通用方法,那么这将更加容易。这在某种程度上取决于你想用你的对象完成什么,以及你想用它们实现的具体程度。如果有其他通用方法,并且阻止您只编写一个David Titarenco的答案已经很好地涵盖了这一方面的通用方法,那么这将更加容易。这在某种程度上取决于你试图用你的目标完成什么,以及你想用它们实现的具体程度。因为这件作品需要了解棋盘,除非我每次都通过棋盘,否则这是不可能的,对吗?我需要确保这一举动不会使它脱离董事会的边缘,所以我必须检查th的指数
e 2D阵列,并确保当前没有其他部件占据其打算移动到的空间。从概念上讲,部件不应了解电路板,因为它只是一个部件。使move方法返回int,以了解执行了多少步骤,并使用您的板管理此信息:因为这件作品需要了解棋盘,除非我每次都通过棋盘,否则这是不可能的,对吧?我需要确保移动不会将其推离电路板边缘,因此我必须检查2D阵列的索引,并确保当前没有其他块占用它打算移动到的空间。从概念上讲,一个块不应该了解电路板,因为它只是一个块。使move方法返回int,以了解执行了多少步骤,并使用您的板管理此信息:因为这件作品需要了解棋盘,除非我每次都通过棋盘,否则这是不可能的,对吧?我需要确保移动不会将其推离电路板边缘,因此我必须检查2D阵列的索引,并确保当前没有其他碎片占据它打算移动的空间。我仔细考虑了这个选项,但我不知道如果我不知道它可以移动到棋盘上的其他位置,我怎么能让它移动。你可能应该制作一个游戏对象的所有碎片元素,反过来,它也包含一个允许交叉访问的棋盘对象。同样,这只是一种模式,但对我来说似乎很直观。如果你不想使用一个更大的对象,它可能会变成一个上帝对象,那么使用依赖注入,这是另一种模式。因为工件需要了解电路板,这是不可能的,除非我每次都通过电路板,对吗?我需要确保移动不会将其推离电路板边缘,因此我必须检查2D阵列的索引,并确保当前没有其他碎片占据它打算移动的空间。我仔细考虑了这个选项,但我不知道如果我不知道它可以移动到棋盘上的其他位置,我怎么能让它移动。你可能应该制作一个游戏对象的所有碎片元素,反过来,它也包含一个允许交叉访问的棋盘对象。同样,这只是一种模式,但对我来说似乎很直观。如果你不想使用一个可能会发展成上帝对象的较大对象,请使用依赖注入,这是另一种模式。