首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改和对象的类。(其他方法?)

更改和对象的类。(其他方法?)
EN

Stack Overflow用户
提问于 2012-06-29 20:58:36
回答 6查看 391关注 0票数 3

当我想这样做的时候,我已经有过几种情况了。这可能是一个示例:

考虑一种可能的国际象棋游戏实现。我们定义了抽象类‘块’和继承它的类:‘毕晓普’,‘培根’,‘塔’,‘马’,‘皇后’等

我们可能有我们的peon即将到达棋盘的末尾,可能需要调用到peon对象上的方法将该对象的类更改为“皇后”、“马”或其他任何对象。

所以我的问题是,有没有办法在C++或Java中做到这一点?如果不是,用任何其他语言?另外,有没有其他的方法来解决这种情况?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-06-29 21:01:29

您也许能够使用decorator patternstrategy pattern

使用装饰器:

代码语言:javascript
复制
interface ChessPiece {
    Set<Move> getPossibleMoves();
    Image getAppearance();
}

class Pawn implements ChessPiece {
    ...
}

class Decorator implements ChessPiece {
    ChessPiece decorated;

    public Decorator(ChessPiece decorated_) {
        this.decorated = decorated_;
    }

    @override
    Set<Move> getPossibleMoves() {
        Set<Move> result = decorated.getPossibleMoves();
        // alter result
        return result;
    }
}

需要时,您可以用Decorated实例替换Pawn实例。因此,正如 answer中提到的那样,它仍然涉及用一个实例替换另一个实例。

代码语言:javascript
复制
ChessPiece pawn = new Pawn;
...
pawn = new Decorated(pawn);

当你提前计划的时候,你可以使用策略,它仍然不是真正的改变类

代码语言:javascript
复制
interface PossibleMovesStrategy {
    Set<Move> getPossibleMoves();
}

interface AppearanceStrategy {
    Image getAppearance();
}

class ChangingChessPiece extends ChessPiece {
    PossibleMovesStrategy posMoves;
    AppearanceStrategy appearance;

    @override
    Set<Move> getPossibleMoves() {
        return posMoves.getPossibleMoves();
    }

    @override
    Image getAppearance() {
        return appearance.getAppearance();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2012-06-29 21:02:19

在像C++或Java这样的语言中,我会创建一个新的‘皇后’或‘马’实例,并用这个新实例替换'Peon‘实例。

票数 10
EN

Stack Overflow用户

发布于 2012-06-29 21:08:37

我认为你对对象的想法与对象的使用方式混淆了。在面向对象的语言中,我们有指示对象实例的内存位置的指针:

代码语言:javascript
复制
Piece pointerToPieceObject = new Peon();

在上面的语句中,pointerToPieceObject是“类型”Piece。由于PeonQueen都继承自Piece,因此此指针可以指向以下任何类型的对象实例:

代码语言:javascript
复制
pointerToPieceObject = new Queen();

这是一个在任何面向对象语言中都支持的非常通用的概念。这些语言之间唯一的区别是如何处理类型(例如,Python和Java )。这个概念叫做多态,可以用来做比上面的例子更奇特的事情:http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11262245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档