避免使用不同的游戏类型进行铸造

问题描述 投票:0回答:1

嘿,我正在构建一个用于创建卷轴游戏的框架,但在我的框架中可以添加不同的游戏类型,而不仅仅是卷轴游戏。例如,主游戏是卷轴游戏,而奖励游戏是轮盘游戏。在我的框架中,现在有一个包含所有游戏的主类。框架的用户可以自己决定哪个游戏是主游戏还是奖励游戏。

两个游戏的父类都是“Game”,卷轴游戏的类是“ReelGame”,轮盘游戏的类是“RouletteGame”。我的包含所有游戏的班级有一个带有“游戏”的列表。

如果我现在想使用 GetGame(...) 访问游戏,则会返回“Game”类,并且我必须将“Game”转换为“ReelGame”或“RouletteGame”才能访问“Slot”中的“Slot” “轮盘游戏”中的“ReelGame”或“Table”。有没有办法防止这种情况发生?

我希望它能得到很好的解释:D 感谢您的任何想法

这是一个简短的例子

public class Game
{
   protected int _id;
   protected GameStateMachine _gameStateMachine;
}

public class ReelGame:Game
{
   public Slot Slot;
}

public class RouletteGame:Game
{
   public Table Table;
}

public class GameController:
{
   private List<Game> _mainGames;
   private List<Game> _bonusGames;

   public Game GetGame(int type, int index)
   {
      if(type == 0)
      {
         return _mainGame[index];
      }
      else if(type == 1)
      {
         return _bonusGames[index];
      }
   }
}

private Foo()
{
   ((ReelGame)gameController.GetGame(0, 0)).Slot // how to avoid
}

c# unity-game-engine casting coding-style
1个回答
0
投票

避免强制转换的一般方法是确保有一个公共接口,这样您就可以调用基类型上的方法而不是进行任何强制转换。但这要求设计类时有一个公共接口。

在设计类层次结构时,您通常希望使用一些抽象概念,而不是将现实世界的概念映射到类。那么这两款游戏有什么共同点呢?据推测,它们都有开始和结束,它们有某种类型的图形,用户控制游戏的某种方式,并且它们可能有某种类型的评分。

因此,当您想开始特定游戏时,您不应该进行任何铸造来获得老虎机或其他任何东西。相反,您应该告诉图形系统为所选游戏绘制图形,将输入重定向到所选游戏等。所有实际的游戏逻辑都应该在游戏内部。

如果您需要将某些功能与实际游戏分开,您可以使用访问者模式

请注意,将功能划分为内聚的类和模块是编程中最困难的问题之一。你几乎肯定会犯一些直到很久以后才意识到的错误。经验和了解其他人如何解决类似问题会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.