2012-02-19 55 views
0

背景: 我最近在AS3中完成了一个tic-tac-toe游戏,使用了我多年前在C语言中编写的一些简单的基于函数的代码。 现在我正在努力做到使用面向对象技术和最佳实践的“正确方式”。 现在,所有东西都被分成整齐的小包装,它看起来很漂亮,而我旅程的最后一部分就是让所有的小狗们相互沟通。Actionscript OOP中的Getter/setter类和范围

我的困境: 我想将保存游戏状态的代码从我的主代码移到com.okaygraphics.model.GameState中它自己的类中。 问题几乎所有其他包都获取并设置这些游戏状态属性。 我想弄清楚封装这个东西的最简单方法,同时还允许我的其他类访问它。

我在哪里:

package com.okaygraphics.model{ 

    public class GameState { 

     private var _player1State:uint=0x00000000; 
     private var _player2State:uint=0x00000000; 
     private var _activePlayer:int=0; 


     public function get p1GameState():uint { 
      return _player1State; 
     } 
     public function set p1GameState(value:uint):void { 
      _player1State = value; 
     } 

     public function get p2GameState():uint { 
      return _player2State; 
     } 
     public function set p2gameState(value:uint):void { 
      _player2State = value; 
     } 

     public function get activePlayer():int { 
      return _activePlayer 
     } 
     public function set activePlayer(value:int):void { 
      _activePlayer = value; 
     } 
    } 
} 

Qestions:

1)我需要一个构造函数?我的意思是,我的程序永远不会有一个以上的GameState。如果我应该把我的getters/setter作为实例方法,我该如何让其他类从它们各自的包中引用SAME实例?

2)我是否需要getter和setter?也许这个班可能只有3个公共财产?如果是的话,我如何达到我的其他课程的适当范围?

3)我应该使用static关键字将所有内容分配给类本身吗?如果是这样,我将如何实现和使用这些静态方法?

4)这是错误吗?我完全只是将自己编入一个角落?

这似乎是一个很常见的任务,但我仍然不完全明白。一个简短的解释,一些链接,或我需要的技术名称将不胜感激。

由于提前, - 最大

回答

4

你可以通过几种不同的方法。

您可以制作GameState a Singleton。这将确保GameState的任何实例都是相同的实例。以下是如何做到这一点:

private static var _gameState:GameState; 
private static var _allowInstantiation:Boolean; 

public function GameState() 
{ 
    if (!_allowInstantiation) 
    { 
     throw new Error("GameState is a Singleton. Use GameState.getInstance() instead of new GameState()."); 
    } 
    else 
    { 
     _allowInstantiation = false; 
    } 
} 

public static function getInstance():GameState 
{ 
    if (!_gameState) 
    { 
     _allowInstantiation = true; 
     _gameState = new GameState(); 
    } 

    return _gameState; 
} 

然后,任何时候你想要得到GameState,使用此语法:

var _gameState:GameState = GameState.getInstance(); 

通过使用一个Singleton,你仍然可以使用getter和setter你已经已经完成,但Singleton将确保访问GameState的每个类都将访问同一个实例。

或者,如果你不想使用单例,你可以让那些私人瓦尔公共静态瓦尔代替:

public static var player1State:uint=0x00000000; 
public static var player2State:uint=0x00000000; 
public static var activePlayer:int=0; 

您将不再需要getter/setter方法,而且你从其他类设置他们是这样的:

GameState.player1State = 0xFF0000; 
GameState.player2State = 0xFF0000; 
GameState.activePlayer = 1; 

无论哪种方式,你建立模型,记得把想法变成如何将与由控制器和视图来传递。请记住,Model和View的分离是MVC模式的主要目标之一。

+0

那个单身的例子很漂亮。正是我所寻找的;谢谢。 – okayGraphics 2012-02-19 22:02:14

2

1)你可以做的是创造类。这是一个只被暗示过的类。一个快速谷歌周围(是AS3单身人士的搜索stackoverflow),你应该找到一个单身人士课程的好例子。使用单例,你只需要包含GameState类,你将访问唯一的一个。

2)只能做得更好,而不是在后面有吸气剂和吸入器的伤害。

3)无法真正回答。

4)没有。似乎要走的路。

+0

+1回答全部4.谢谢 – okayGraphics 2012-02-19 21:13:25

1

我强烈建议你看看MVC的设计模式,并在游戏中使用它。 (本场比赛的状态是模式的一部分。)

现在,至于如何从所有其他类访问游戏状态(这是正确的词不是包),你可以使用singleton pattern