面向对象与效率

我正在开发一个Java程序并考虑以下问题:

  • 该作品需要实施直线移动。
  • Bishop作品需要实现以对角线移动。
  • 然而,

  • 女王的作品需要实现上述两种动作模式。
  • 我想不出一个干净的解决方案来建模这种关系,我曾经考虑过一些,但没有一个都符合良好的面向对象的设计和高效的代码。

  • Java不支持多重继承,因此Queen不能借用Rook和Bishop的实现

  • 如果Rook和Bishop延长皇后,我需要将每种运动的逻辑提取为单独的方法,这将严重膨胀我目前的运动验证设计。

  • 上述两种解决方案都不够优雅,无法击败:

  • 把所有的移动实现放到所有块的父类中,这样它们都可以共享所有的通用实现(其中有很多)
  • 我知道解决方案3违反了良好的Java设计,但在这种情况下,这种设计模式似乎只是强制臃肿,不合理的解决方案。

    也许可以通过对程序进行彻底重组来避免这种情况,但到目前为止,对我而言,一切都很有效,但是良好的OO设计总是以牺牲功能和结构的直接性为代价的? 我的方法对于语言的风格错误吗?

    你会如何解决这个问题?


    虽然有些类可能会以类似的方式运行,但这并不意味着它们处于同一层次结构中!

    例如, HumanCrab都可以横向移动,但是Human扩展Crab是愚蠢的。

    如果你真的想重新使用移动代码,你可以用封装,使用Movement型,使它像这样:

    class Human
    {
       List<Movement> movements;
    }
    
    class Crab
    {
        List<Movement> movements;
    }
    
    class MoveSideWays extends Movement
    {
          move();
    }
    
    class MoveForward extends Movement
    {
          move();
    }
    

    但它感觉像过度工程。 我会用getPossibleMoves()getPossibleMoves()一个Piece类,并直接实现它。 没有太多重叠,Rooks也有专门的动作(Castling)。

    class Rook extends Piece
    {
       List<Move> getPossibleMoves()  {...}
    }
    
    class Queen extends Piece
    {
       List<Move> getPossibleMoves() {...}
    }
    

    您不应该将超类 - 子类关系添加到各个部分。 女王不是白嘴鸦的特例,白嘴鸦也不是女王的特例。 他们只是不同的部分。 你可以创建一个接口(或一个抽象类) Piece并提供RookBishopQueen等不同的实现。


    你可以将两个方法都移动到超类,但是使它们保持protected static (你也可以把这些方法放在PieceHelper )。 在子类中,您可以实现适当的方法,引用这些方法中的一个(使其public )。

    超类:

    abstract class Piece {
        protected static void moveStraight(Piece p) {...}
        protected static void moveDiagonal(Piece p) {...}
    }
    

    (可选)接口:

    interface DiagonalMover {
         void moveDiagonal();
    }
    interface StraightMover {
         void moveStraight();
    }
    

    子类:

    class Rook extends Piece implements StraightMover {
        public void moveStraight() {Piece.moveStraight(this);}
    }
    class Bishop extends Piece implements DiagonalMover {
        public void moveDiagonal() {Piece.moveDiagonal(this);}
    }
    class Queen extends Piece implements StraightMover, DiagonalMover {
        public void moveStraight() {Piece.moveStraight(this);}
        public void moveDiagonal() {Piece.moveDiagonal(this);}
    }
    
    链接地址: http://www.djcxy.com/p/84623.html

    上一篇: Object orientation vs Efficiency

    下一篇: Moving chess pieces in native javascript