在动作3中,对变量使用get和set之间的区别是什么?

use*_*131 1 actionscript-3

我的问题是针对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;
    }
}
Run Code Online (Sandbox Code Playgroud)

或这个 :

public class Test
{
    public var foo:String;

    public function Test() 
    {
        foo = "";
    }
}
Run Code Online (Sandbox Code Playgroud)

你最终会这样做(从另一个类中获取或设置你的foo变量):

testObject.foo
Run Code Online (Sandbox Code Playgroud)

使用公共变量对我来说看起来更干净.我知道我错过了什么.你能告诉我它是什么吗?

Mar*_*rty 7

在我们继续之前,要了解当您定义getter和setter时,它们实际上不需要与类中定义的属性相关联.Getters只需要返回一个值,而setter必须接受一个值(但如果你愿意的话,绝对不能做任何事情).

现在回答这个问题:

最简单的原因是,您可以通过声明一个而不另一个来使属性读或写.关于只读,请花一点时间考虑让一个类公开一个值而不让你的应用程序的其他部分能够修改它的好处.举个例子:

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

    public function get fullName():String
    {
        return firstName + " " + lastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,该属性fullName是结果firstNamelastName.这样可以提供一致,准确的值,您可以预期修改firstNamelastName修改:

person.firstName = "Daniel";
trace(person.fullName); // Daniel Wallace
Run Code Online (Sandbox Code Playgroud)

如果fullName实际上是另一个公共变量,那么你最终会得到意想不到的结果:

person.fullName = "Daniel Wallace";
trace(person.firstName); // Marty - Wait, what?
Run Code Online (Sandbox Code Playgroud)

有了这个,请注意getters并且setters是功能.意识到函数可以包含多行代码.这意味着你的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以在幻灯片中幻灯片之间进行简单的转换:

slideshow.currentSlide = 4;
Run Code Online (Sandbox Code Playgroud)

甚至连续循环播放幻灯片,并始终如一地使用:

slideshow.currentSlide ++;
Run Code Online (Sandbox Code Playgroud)