对于个人项目,我正在开发一个基于网络的小型游戏。
我有一个 Card
类,它有一个 Status
属性,而且到处都是 case 语句。我想,嘿,这对 Replace Conditional with Polymorphism 来说是个好机会!
问题是,我有几个方法可以做这样的事情:
public class Card
{
public void ChangeStatus()
{
switch (Status)
{
case MyStatusEnum.Normal:
Status = MyStatusEnum.Underwater;
break;
case MyStatusEnum.Underwater:
Status = MyStatusEnum.Dead;
break;
// etc...
}
}
}
在新的
NormalCard
类中重构它时,我像这样覆盖 ChangeStatus
方法:public override void ChangeStatus()
{
base.Status = MyStatusEnum.Underwater;
}
问题是
NormalCard
的这个对象的状态为 Underwater
。我无法重新分配 this
的类型,而且我真的不想将方法的返回值从 void
更改为 CardBase
。我有哪些选择?有没有标准的方法来做到这一点?编辑 Tormod 让我直截了当。我想要 State Pattern 。谢谢大家!
最佳答案
在您的情况下,我有一个包含 Card
属性的 CardStatus
对象。 CardStatus
的子类型对应于之前的枚举值。重构依赖于当前状态的行为,除了状态转换在 CardStatus 子类型内。
IMO 中的第一个示例中的状态转换应保留在 Card
对象内。状态改变感觉更像是包含卡片的行为而不是状态对象的行为。您可以做的是让 CardStatus 对象告诉您事件后要转换到的状态。
一个粗略的例子:(显然可以使用更多的变化。)
应用程序接口(interface)
interface ICardStatus {
ICardStatus NextStatus(Card card);
void DoStuff(Card card);
}
class Card {
ICardStatus Status = new NormalCardStatus();
void DoStuff() {
Status.DoStuff(this);
}
void ChangeStatus() {
Status = Status.NextStatus(this);
}
}
状态实现
class NormalCardStatus : ICardStatus {
ICardStatus NextStatus(Card card) {
return new UnderwaterCardStatus();
}
void DoStuff(Card card) {
// ...
}
}
class UnderwaterCardStatus : ICardStatus {
ICardStatus NextStatus(Card card) {
return new DeathStatus();
}
void DoStuff(Card card) {
// ...
}
}
class DeathCardStatus : ICardStatus {
ICardStatus NextStatus(Card card) {
// ...
}
void DoStuff(Card card) {
throw new Exception("Cannot do anything while dead");
}
}
关于c# - 用多态替换条件 - 当你的类型改变时如何处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9484849/