Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在ActionScript3中,对变量使用get和set与将其公开有什么区别?_Actionscript 3 - Fatal编程技术网

Actionscript 3 在ActionScript3中,对变量使用get和set与将其公开有什么区别?

Actionscript 3 在ActionScript3中,对变量使用get和set与将其公开有什么区别?,actionscript-3,Actionscript 3,我的问题是针对as3的。 当我使用这种语言时,我觉得任何带有getter和setter的变量都应该公开。 无论您是否这样做: public class Test { private var _foo:String; public function Test() { foo = ""; } public function get foo():String { return _foo; } pu

我的问题是针对as3的。 当我使用这种语言时,我觉得任何带有getter和setter的变量都应该公开。 无论您是否这样做:

public class Test
{
    private var _foo:String;

    public function Test() 
    {
        foo = "";
    }

    public function get foo():String 
    {
        return _foo;
    }

    public function set foo(value:String):void 
    {
        _foo = value;
    }
}
或者这个:

public class Test
{
    public var foo:String;

    public function Test() 
    {
        foo = "";
    }
}
最终,您将从另一个类获取或设置foo变量:

testObject.foo
在我看来,使用公共变量要干净得多。 我知道我错过了什么。
您能告诉我它是什么吗?

在继续之前,请理解定义getter和setter时,它们实际上不需要与类中定义的属性相关联。getter只需返回一个值,setter必须接受一个值,但如果您愿意的话,它完全不能做任何事情

现在回答问题:

最简单的原因是,通过声明一个属性而不声明另一个属性,可以使属性仅读或只写。就只读而言,花一点时间考虑一个类暴露一个值的好处,而不需要应用程序的其他部分能够修改它。例如:

public class Person
{
    public var firstName:String = "Marty";
    public var lastName:String = "Wallace";

    public function get fullName():String
    {
        return firstName + " " + lastName;
    }
}
请注意,属性fullName是firstName和lastName的结果。如果要修改firstName或lastName,这将提供一致、准确的值:

person.firstName = "Daniel";
trace(person.fullName); // Daniel Wallace
如果fullName与其他两个变量一起实际上是一个公共变量,则最终会出现意外结果,如:

person.fullName = "Daniel Wallace";
trace(person.firstName); // Marty - Wait, what?
有了这些,请注意getter和setter是函数。认识到一个函数可以包含多行代码。这意味着您的getter和setter实际上可以在简单地获取和设置值的基础上做很多事情,如验证、更新其他值等。例如:

public class Slideshow
{
    private var _currentSlide:int = 0;
    private var _slides:Vector.<Sprite> = new <Sprite>[];

    public function set currentSlide(value:int):void
    {
        _currentSlide = value;

        if(_currentSlide < 0) _currentSlide = _slides.length - 1;
        if(_currentSlide >= _slides.length) _currentSlide = 0;

        var slide:Sprite = _slides[_currentSlide];

        // Do something with the new slide, like transition to it.
        //
    }

    public function get currentSlide():int
    {
        return _currentSlide;
    }
}
甚至连续循环播放幻灯片,始终使用:

slideshow.currentSlide ++;

在继续之前,请理解定义getter和setter时,它们实际上不需要与类中定义的属性相关联。getter只需返回一个值,setter必须接受一个值,但如果您愿意的话,它完全不能做任何事情

现在回答问题:

最简单的原因是,通过声明一个属性而不声明另一个属性,可以使属性仅读或只写。就只读而言,花一点时间考虑一个类暴露一个值的好处,而不需要应用程序的其他部分能够修改它。例如:

public class Person
{
    public var firstName:String = "Marty";
    public var lastName:String = "Wallace";

    public function get fullName():String
    {
        return firstName + " " + lastName;
    }
}
请注意,属性fullName是firstName和lastName的结果。如果要修改firstName或lastName,这将提供一致、准确的值:

person.firstName = "Daniel";
trace(person.fullName); // Daniel Wallace
如果fullName与其他两个变量一起实际上是一个公共变量,则最终会出现意外结果,如:

person.fullName = "Daniel Wallace";
trace(person.firstName); // Marty - Wait, what?
有了这些,请注意getter和setter是函数。认识到一个函数可以包含多行代码。这意味着您的getter和setter实际上可以在简单地获取和设置值的基础上做很多事情,如验证、更新其他值等。例如:

public class Slideshow
{
    private var _currentSlide:int = 0;
    private var _slides:Vector.<Sprite> = new <Sprite>[];

    public function set currentSlide(value:int):void
    {
        _currentSlide = value;

        if(_currentSlide < 0) _currentSlide = _slides.length - 1;
        if(_currentSlide >= _slides.length) _currentSlide = 0;

        var slide:Sprite = _slides[_currentSlide];

        // Do something with the new slide, like transition to it.
        //
    }

    public function get currentSlide():int
    {
        return _currentSlide;
    }
}
甚至连续循环播放幻灯片,始终使用:

slideshow.currentSlide ++;

<> P.>实际上有很多很好的理由考虑使用访问器而不是直接暴露类的字段——不仅仅是封装的参数,并且使将来的更改更容易。 以下是一些原因:

封装与获取或设置属性相关的行为 这使得以后可以更容易地添加验证等附加功能。 隐藏属性的内部表示,同时使用替代表示公开属性。 将公共接口与更改隔离,允许公共接口在实现更改时保持不变,而不会影响现有使用者。 控制生命和内存管理语义的属性,在非托管内存环境中尤其重要,如C++或Objtovi-C。 为属性在运行时更改提供调试截取点—在某些语言中,如果没有此功能,调试属性何时何地更改为特定值可能非常困难。 改进了与旨在针对属性getter/settersmock、序列化和WPF进行操作的库的互操作性。 允许继承者更改属性行为的语义,并通过重写getter/setter方法公开。 允许getter/setter作为lambda表达式而不是值传递。 getter和setter可以允许不同的访问级别,例如get可能是公共的,但是set可以被保护。
<> P.>实际上有很多很好的理由考虑使用访问器而不是直接暴露类的字段——不仅仅是封装的参数,并且使将来的更改更容易。 以下是一些原因:

封装与获取或设置道具相关的行为 埃蒂 这使得以后可以更容易地添加验证等附加功能。 隐藏属性的内部表示,同时使用替代表示公开属性。 将公共接口与更改隔离,允许公共接口在实现更改时保持不变,而不会影响现有使用者。 控制生命和内存管理语义的属性,在非托管内存环境中尤其重要,如C++或Objtovi-C。 为属性在运行时更改提供调试截取点—在某些语言中,如果没有此功能,调试属性何时何地更改为特定值可能非常困难。 改进了与旨在针对属性getter/settersmock、序列化和WPF进行操作的库的互操作性。 允许继承者更改属性行为的语义,并通过重写getter/setter方法公开。 允许getter/setter作为lambda表达式而不是值传递。 getter和setter可以允许不同的访问级别,例如get可能是公共的,但是set可以被保护。
你回答的第二部分帮助很大!由于它们是函数,getter和setter可以做的不仅仅是返回或设置值。我想你必须在可能性和干净的代码之间做出选择。我已经得到了第一部分。这就是为什么我的问题是关于读写属性的。非常感谢马蒂!你回答的第二部分帮助很大!由于它们是函数,getter和setter可以做的不仅仅是返回或设置值。我想你必须在可能性和干净的代码之间做出选择。我已经得到了第一部分。这就是为什么我的问题是关于读写属性的。非常感谢马蒂!你是最后一个点-相同名称的getter和setter实际上不能有不同的访问修饰符?为了以防万一,我做了几次测试,效果不错。谈论ActionsScript 3.you’你是最后一个点-同名的获取者和设置者实际上不能有不同的访问修饰符。嘿@Marty,如果你尝试,你会收到什么错误消息?为了以防万一,我做了几次测试,效果不错。谈论行动脚本3。