扩展类的糟糕经验

时间:2011-09-05 00:13:51

标签: flash actionscript-3 class ant

我已经在ActionScript中编程了一段时间,尽管我几乎不了解扩展类是如何工作的。我的大多数项目都是单文件脚本,因此您可以想象尝试使用1000+行文件(对于某些人来说可能太少了:P)。

尝试浏览大量的在线教程最多令人生畏或令人困惑,并且没有解释扩展实际上是如何工作的。找到一个描述所需的每个基本关键词的人都会很好。

在过去的项目中,我设法使用了两个脚本,但技术上并没有扩展一个类(我相信)。例如:

Main.as (主文件)

package {

    import flash.display.Sprite;

    public class Main extends Sprite {

        public function Main () {
            trace(GLOBAL.version); // "1.0"
        }

    }

}

GLOBAL.as (同一目录中的帮助脚本):

package {

    public class GLOBAL {

        public static var version:String = "1.0";

    }

}

即使我没有专门导入GLOBAL.as文件,它仍然可以访问。

我从SO社区要求的是:如何使用同一目录和另一个目录中的文件更好地理解扩展类的工作原理,将主文件用作简单的“包含器”,将其他文件用作帮助程序,例如在舞台上添加Sprite。希望我没有比这更困难。但由于某种原因,我无法“得到它”。

其他说明:我使用JavaScript比使用ActionScript要多得多,所以任何希望提供从JavaScript到ActionScript的教程都是一个优势!

4 个答案:

答案 0 :(得分:2)

我建议一般来看一些面向对象的教程。我会给你我对三个面向对象元素的看法。类,扩展和对象。

对象是某事物的实例。这方面的一个例子可能是两个单独的人在两台单独的计算机上使用相同的系统。它们是两个单独的对象,通常称为实例化。对象实例化一个类。

一个类定义一个对象并提供它的功能。类的示例可以是例如存储所有连接细节的数据库类。数据库类需要由对象实例化,以满足系统的要求,例如,将汽车品牌插入数据库。

扩展类(通常称为类继承)实际上继承了父类的所有功能。一个例子可能是数据库类(我之前提到过)从用户表继承逻辑?在开发iPhone应用程序时,您经常会继承特定的框架功能,并在必要时进行修改以制作定制系统......

希望这在某种程度上有所帮助。

答案 1 :(得分:1)

包含脚本的目录的另一个词是'包'。在AS3中,同一目录或包中的文件可自动相互使用,因此无需显式导入它们。子目录中的文件不会自动导入,文件也不是父文件夹。

就类的结构及其交互而言,我建议熟悉OOP设计模式。 Gang of Four书是一个很好的参考书,虽然它没有专门针对AS3,或者O'Reilly发布了更具体的Adobe Developer Library参考书。

答案 2 :(得分:1)

首先,您不必专门导入GLOBAL.as文件的原因是因为它与另一个类位于同一个包文件夹中。如果它在另一个包中则需要导入。

我喜欢将类视为您定义数据和函数的模板。然后,您创建此对象的实例。该实例封装了此数据,仅提供某些公共功能。这个想法是,其他外部实例可以通过预定义的接口与另一个实例进行通信,比如合同,它说,如果你调用这个函数并将其传入,我将返回此信息。隐藏了这个类如何实现的实际实现,因此,很容易改变内部工作而不影响系统的其余部分。

扩展类也称为继承。如果一个类需要公共函数和数据,而不是有两个具有一些相似函数和一些不同函数的独立类,我们可以改为拥有一个具有两者共同功能的基类。然后子类可以扩展它,因此它具有这些功能,以及添加它自己的功能。这样,如果更改基类中的函数,那么扩展它的所有类将自动使用这个新更改的函数,从而减少维护和错误。

至于在另一个目录中使用类,我们使用包语法来定义类的位置。

例如:com.shaz.physics.MyClass

您将拥有一个名为com的文件夹。在该文件夹里面的文件夹是shaz,在文件夹物理里面,在你的MyClass.as文件里面。在该MyClass.as文件中,包将是package com.shaz.physics。其他文件夹中的其他类则需要将您的类导入为:import com.shaz.physics.MyClass

最后,如果你需要帮助类,那么将函数设置为静态可能是一个好方法。例如,如果您有一个Math类来执行某些操作,则可以将其定义为:

public class Math
{
    public static function doSomething():void
    {

    }   
}

然后,您可以只执行Math.doSomething();

,而不是创建对象的实例

答案 3 :(得分:1)

在ActionScript 3.0中扩展类在OOP中称为Inheritance

如果查看ActionScript 3.0文档,可以看到哪些类扩展或从其他类继承。我们以MovieClip为例:

enter image description here

MovieClip Sprite 的扩展,它是 DisplayObjectContainer 的扩展,是 InteractiveObject 的扩展>等等。

这意味着 MovieClip 不仅包含它自己的本机函数和属性,还包含 Sprite 的所有函数和属性以及 Sprite <的所有函数和属性/ em>也继承自 DisplayObjectContainer ,其他类中的所有函数和属性一直向下到 Object

因此,如果您创建一个扩展 Sprite 的类,您将自动访问所有Sprite的本机和继承函数和属性。但是,您将无法访问MovieClip的函数和属性,因为 Sprite MovieClip 的子类。