【问题标题】:Actionscript Getter/setter class & scope in OOPOOP 中的 Actionscript Getter/setter 类和范围
【发布时间】:2012-02-19 20:10:19
【问题描述】:

背景: 我最近在 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;
        }
    }
}

问题:

1) 我需要构造函数吗?我的意思是,我的程序永远不会有多个 GameState。如果我应该将我的 getter/setter 调用为实例方法,我如何让其他类从它们各自的包中引用相同的实例?

2) 我还需要 getter 和 setter 吗?也许这个类可能只有 3 个公共属性?如果是这样,我将如何获得其他课程的适当范围?

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

4) 这是一个错误吗?我完全只是把自己编程到了一个角落吗?

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

提前致谢, -最大

【问题讨论】:

    标签: actionscript-3 oop scope getter-setter


    【解决方案1】:

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

    您可以将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 模式的主要目标之一。

    【讨论】:

    • 那个单例的例子很漂亮。正是我想要的;谢谢。
    【解决方案2】:

    1) 你可以做的是创建 singleton 类。这是一门只提示过一次的课程。一个快速的谷歌搜索(搜索 AS3 Singleton 的 stackoverflow),你应该找到一些很好的单例类示例。对于单例,您只需要包含 GameState 类,您将访问唯一的一个。

    2) 稍后将 getter 和 setter 放入其中只会利大于弊。

    3) 无法真正回答。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2016-09-14
        • 2010-11-13
        • 2019-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        相关资源
        最近更新 更多