Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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
Oop 关于actionscript 3中的范围和属性引用的具体问题_Oop_Class_Actionscript_Scope_Access Modifiers - Fatal编程技术网

Oop 关于actionscript 3中的范围和属性引用的具体问题

Oop 关于actionscript 3中的范围和属性引用的具体问题,oop,class,actionscript,scope,access-modifiers,Oop,Class,Actionscript,Scope,Access Modifiers,我已经和AS3斗争了一段时间,我正在开发一个只使用actionscript和FlashDevelop/flex编译器组合的简单应用程序。我对OOP的理解有点不成熟,我想知道是否有人能给我指出正确的方向。我真的读了好几本书,花了很多时间阅读在线教程等,但有些东西就是不点击 让我困惑的是:根据我读到的内容,当某个东西被声明为“公共”时,它在应用程序中的任何地方都是可用的,因此应该谨慎使用!但是,当我尝试在程序中使用公共属性和方法时,它们肯定是在实例化它们的类/对象之外的任何地方都不可用的 这使我得出

我已经和AS3斗争了一段时间,我正在开发一个只使用actionscript和FlashDevelop/flex编译器组合的简单应用程序。我对OOP的理解有点不成熟,我想知道是否有人能给我指出正确的方向。我真的读了好几本书,花了很多时间阅读在线教程等,但有些东西就是不点击

让我困惑的是:根据我读到的内容,当某个东西被声明为“公共”时,它在应用程序中的任何地方都是可用的,因此应该谨慎使用!但是,当我尝试在程序中使用公共属性和方法时,它们肯定是在实例化它们的类/对象之外的任何地方都不可用的

这使我得出结论,即使不同类的对象是从同一个类(比如“main”类)实例化的,它们也根本无法相互通信,即使是通过公共成员

如果是这样的话,那就很公平了,但老实说,我在任何地方都没有看到这一点得到恰当的解释。更重要的是,不同的对象如何与其他对象通信?那么,如果Public只能通过直接合成层次结构工作,那么它实际上意味着什么呢?如果一个人必须只基于从composer类到它自己的对象的通信来编写应用程序,并且可能会将事件用于,呃,其他一切这不是很严格吗

我相信这是基本的面向对象的东西,所以我提前道歉


任何快速提示或链接都将不胜感激。

您的问题中包含了不同的主题。让我澄清一下:

修饰语public是什么意思? 同一类的实例如何相互通信? -

一,

在OOP中,您可以使用对象组织代码。需要实例化对象以提供其功能。可以将实例化对象的位置视为上下文。在Flash中,上下文可能是第一帧,在纯AS3电影中,它可能是主类,在Flex中,它可能是主mxml文件。事实上,上下文也总是一个对象。对象公共类MyClass的类修饰符告诉上下文是否允许实例化对象。如果设置为“内部”,则上下文必须与对象的类位于同一目录中。否则,不允许创建该类的新对象。Private或protected不是有效的类修饰符。公共课。。。意味着任何上下文都可以创建该类的对象。下一步:实例化不仅由这些修饰符控制,而且还由类型的可见性控制。如果设置为internal,则不能在与internal type不在同一目录中的上下文中使用类似var obj:InternalType的表达式

那么方法和属性呢?即使允许您的上下文访问类型,某些属性和方法也可能受到内部/受保护/私有var/方法的限制,您可能无法调用它们

为什么我们有这样的限制?答案很简单:不同的开发人员可以开发同一软件的不同部分。这些部件应仅通过定义的接口进行通信。这些接口应尽可能小。因此,开发人员声明了尽可能多的代码,以便从外部隐藏,并且只公开必要的类型和属性

不要与修改器和全局属性混淆。修饰符仅告诉您是否允许上下文查看类型或方法。全局变量在整个代码中都是可用的。因此,即使一个类被声明为公共类,该类的实例在默认情况下也彼此不认识。您可以通过以下方式让他们知道:

将实例存储在全局变量中 提供setter,例如set obj1obj1:OBJ1:void,其中每个对象都需要将引用存储在实例变量中 将对象作为方法参数传递:doSomethingobj1:OBJ1 希望这能帮助你更好地理解OOP。我很高兴回答你的后续问题


Jens

@Jens回答免责声明:我略读的内容似乎完全正确

但是,我不确定它是否非常直接地回答了您的问题,所以我将在这里补充一点

公共属性是该类实例的属性,可供其他对象使用function:call、variable:access等。但是,要使用它们,必须有一个引用,如非常基本的指针,如果有帮助的话?指向该对象实例。实例化的对象创建新的。。。该对象可以通过将其分配给该类类型的变量来获取该引用

// Reference is now stored in 's'
public ExampleClass s = new ExampleClass();
如果愿意,您可以选择创建静态属性,只需知道类名即可。该属性将由该类的所有实例共享,任何外部类都可以引用它,假设它是公共静态的 类名

//static property access
ExampleClass.foo
ExampleClass.bar(var)
公共属性由存储的引用引用

//public property access
s.foo
s.bar(var)
静态属性由类名引用

//static property access
ExampleClass.foo
ExampleClass.bar(var)
创建实例并存储对对象的引用后,可以根据需要传递它。OtherExampleClass类型的以下对象将在其构造函数中接收对“s”的引用,并且必须将其存储在自己的局部变量中才能保留引用

public OtherExampleClass s2 = new OtherExampleClass(s);