Actionscript 3 在ActionScript3中,对变量使用get和set与将其公开有什么区别?
我的问题是针对as3的。 当我使用这种语言时,我觉得任何带有getter和setter的变量都应该公开。 无论您是否这样做: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
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。