Actionscript Getter / setter类& OOP中的范围

时间:2012-02-19 20:10:20

标签: actionscript-3 oop scope getter-setter

背景: 我最近在AS3中完成了一个井字游戏,使用了我多年前用C编写的一些基于函数的简单代码。 现在,我正在寻求使用OOP技术和最佳实践“正确的方式”。 现在一切都被分成整齐的小包装,看起来很漂亮,我旅程的最后一部分是让所有的小家伙彼此沟通。

我的困境: 我想将保存游戏状态的代码从我的main移动到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。如果我应该将getter / setter作为实例方法调用,如何让其他类从各自的包中引用SAME实例?

2)我是否需要吸气剂和二传手?也许这个班可能只有3个公共场所?如果是这样,我将如何实现与其他课程相关的适当范围?

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

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

这似乎是一项非常常见的任务,但我仍然不完全理解。我将非常感谢您提供的简短解释,一些链接或技术名称。

提前致谢, -max

3 个答案:

答案 0 :(得分:4)

你可以通过几种不同的方式来解决这个问题。

您可以将GameState设为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的每个类都将访问同一个实例。

或者,如果您不想使用Singleton,则可以改为使用私有变量公共静态变量:

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;

无论你设置模型,还是要考虑控制器和视图如何与它进行通信。请记住,模型和视图的分离是MVC模式的主要目标之一。

答案 1 :(得分:2)

1)你可以做的是创建 singleton 类。这是一个只被暗示过一次的课程。一个快速谷歌(AS3 Singleton的搜索堆栈溢出),你应该找到一些单例类的好例子。使用单例,您只需要包含GameState类,您将访问唯一的一个。

2)稍后只能使用吸气剂和固定剂来做更好的伤害。

3)无法真正回答。

4)不。似乎是要走的路。

答案 2 :(得分:1)

我强烈建议您查看MVC设计模式并在游戏中使用它。 (游戏状态是模型的一部分。)

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