【问题标题】:specific questions about scope and property reference in actionscript 3actionscript 3 中有关范围和属性引用的具体问题
【发布时间】:2011-10-13 06:03:56
【问题描述】:

我已经与 AS3 斗争了一段时间,我正在开发一个仅使用 actionscript 和 FlashDevelop/flex-compiler 组合的简单应用程序。在我刚刚起步的 OOP 理解中,我遇到了一些障碍,我想知道是否有人能够为我指出正确的方向。我已经真正阅读了几本书,并花了很多时间阅读在线教程等,但有些东西就是没有点击!

让我感到困惑的是:根据我的阅读内容,当某些东西被声明为“公共”时,它因此可以在应用程序的任何地方使用(因此应该小心使用!)但是,当我尝试使用公共属性时和我的程序中的方法,除了实例化它们的类/对象之外,它们绝对不能在任何地方使用。

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

如果是这样,那么就足够公平了,但老实说,我没有看到任何地方对此进行了正确解释。更重要的是,不同的对象如何与其他对象进行通信?如果它只通过直接的组合层次结构起作用,那么 Public 究竟意味着什么?如果一个人必须只基于从作曲家类到它自己的对象的通信来编写应用程序(并且可能将事件用于,呃,其他一切?) - 这不是非常严格吗?

我确定这是基本的 OOP 内容,所以我提前道歉!

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

【问题讨论】:

    标签: oop class actionscript scope access-modifiers


    【解决方案1】:

    您的问题涉及不同的主题。让我澄清一下:

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

    --

    1.

    在 OOP 中,您使用对象来组织代码。需要实例化对象以提供其功能。您实例化对象的地方可以被视为“上下文”。在 Flash 中,上下文可能是第一帧,在纯 AS3 电影中,它可能是主类,在 Flex 中,它可能是主 mxml 文件。事实上,上下文也始终是一个对象。对象的类修饰符public class MyClass 告诉您的上下文是否允许实例化该对象。如果设置为internal,则上下文必须与对象的类位于同一目录中。否则不允许创建类的新对象。 Privateprotected 不是有效的类修饰符。 Public class ... 表示任何上下文都可以创建该类的对象。 Next: 不仅实例化由这些修饰符控制,而且类型的可见性也受到控制。如果设置为internal,则不能在与内部类型不在同一目录中的上下文中使用var obj : InternalType 之类的表达式。

    方法和属性呢?即使允许您的上下文访问某个类型,某些属性和方法也可能会受到限制internal/protected/private var/method,您可能无法调用它们。

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

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

      • 将实例存储在全局变量中
      • 提供setter,例如set obj1(obj1 : OBJ1) : void,其中每个对象都需要将引用存储在实例变量中
      • 将对象作为方法参数传递:doSomething(obj1 : OBJ1)

    希望这可以帮助您更多地了解 OOP。我很高兴回答您的后续问题。

    詹斯

    【讨论】:

      【解决方案2】:

      @Jens 的回答(免责声明:我略读)似乎完全正确。

      不过,我不确定它是否能非常直接地回答你的问题,所以我会在这里补充一点。

      public 属性是该类instance 的属性,可供其他对象使用(函数:调用、变量:访问等)。但是,要使用它们,您必须有一个指向该对象实例的 reference(就像一个非常基本的指针,如果有帮助的话?)。实例化(创建、新建 ...)该对象的对象可以通过将该引用分配给该类类型的变量来获取该引用。

      // Reference is now stored in 's'
      public ExampleClass s = new ExampleClass();
      

      如果您愿意,您可以选择创建 static 属性,只需知道 class 名称即可使用该属性。该属性将由该类的所有实例共享,并且任何外部类都可以通过引用类名来引用它(假设它是 public static)。

      public 属性由您存储的引用引用。

      //public property access
      s.foo
      s.bar(var)
      

      类名引用静态属性。

      //static property access
      ExampleClass.foo
      ExampleClass.bar(var)
      

      创建实例并将引用存储到对象后,您可以随意传递它。下面的 OtherExampleClass 类型的对象将在其构造函数中接收对“s”的引用,并且必须将其存储在自己的局部变量中以保留引用。

      public OtherExampleClass s2 = new OtherExampleClass(s);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-09
        • 2022-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多