AS3 OOP常用实践示例?

时间:2011-08-01 20:29:19

标签: actionscript-3 oop

我正在努力更好地理解AS3 OOP结构和组织,但是我遇到了一些问题。我想创建多个类文件,似乎最佳做法是不将所有类放在一个文件中?我在网上搜索了几个小时,并提出了一些很好的例子。使用AS3时可能不是单独的文件,但对我来说,它只对模块化有意义。我一直在玩的文件是:

  • Main.fla
  • Main.as(文件类)
  • TestOne.as
  • TestTwo.as
  • TestThree.as
  • TestFour.as
  • TestFive.as

我创建了一个名为classes的文件夹来存放除了驻留在FLA中的Main.as之外的所有类文件。

除文件名和类名外,所有五个Test类都是相同的代码。

以下是我导入文件的方式:

Main.as

package classes
{
import flash.display.MovieClip;

import classes.TestOne;
     import classes.TestTwo;
     import classes.TestThree;
     import classes.TestFour;
     import classes.TestFive;

public class Init extends MovieClip
{
    trace("This is Main Class");
    var testOne : TestOne = new TestOne;
}
}

TestOne.as

package classes
{
import flash.display.MovieClip;

public class TestOne extends MovieClip
{
    trace("This is TestOne");

    public function testing():String
    {
        return "This is the testing method";
    }
}
}

以上示例我是否创建了良好的AS3 OOP实践?我知道这些是真正的基础课程,但我认为它应该得到了重点。

我正在使用CS3

6 个答案:

答案 0 :(得分:2)

看看Flex SDK coding conventions and best practices可能会很好。这是一个逐点概述你应该如何使用ActionScript 3.整个过程中分散了大量的OOP内容,因此请仔细浏览它。我认为值得任何新的或经验丰富的AS3开发人员阅读,因为那里有很多有用的信息。

答案 1 :(得分:1)

OOP是一个很大的主题,但here is a good primer

答案 2 :(得分:1)

ActionScript 3 design patterns对您也很有用。

答案 3 :(得分:0)

正如内森所说,大话题。

关于在一个文件中包含所有类的事情与“类的可见性”和“访问修饰符”这一主题有关。

修饰符是在class关键字之前写的内容。它可以是公共的或内部的。内部意味着,只有放在内部类的同一目录(包)中的代码才能创建它的对象。公共意味着,任何代码都可以创建类的实例。通过谷歌随机链接:http://flexmaster.blog.co.in/2010/05/20/action-script-use-access-modifiers-with-classes-and-class-members/

您可以在一个文件中拥有多个类。但是只有一个人可以将修饰语公之于众。所有其他人都需要内部。如果省略修饰符,则默认情况下内部可见一个类。只能从此文件中访问多类文件中的内部类。

还有两个修饰符:protected和private。两者仅适用于属性或方法。作为高级开发人员,您甚至可以使用命名空间定义自己的修饰符。

答案 4 :(得分:0)

OOP规则仍适用于AS3
1)封装。
2)继承 3)抽象 4)多态性
是否应用它们是您的选择,但这是一种很好的做法 并且不要忘记最重要的规则“KISS”(保持简单愚蠢)

我还想指出你的代码有错误

package classes
{
import flash.display.MovieClip;

public class TestOne extends MovieClip
{
    trace("This is TestOne");// this line is not inside a function and will most undoubtly error out your app.

    public function testing():String
    {
        return "This is the testing method";
    }
}
}

答案 5 :(得分:0)

我认为当您将代码复制到SO中或者您没有正确放置跟踪语句时,您要么做错了。您需要将trace("This is TestOne");放在TestOne.as中的构造函数中,如下所示:

public function TestOne() {
    trace("This is TestOne");
}

Init类中的代码也是如此,现在读取:

trace("This is Main Class");
var testOne : TestOne = new TestOne;

但应该是(注意新TestOne之后的护腕):

public function Init() {
    trace("This is Main Class");
    var testOne : TestOne = new TestOne();
}

运行SWF时会发生什么,类Init的构造函数会:

1)将“这是主类”跟踪到您的控制台。

2)它将通过调用类TestOne的构造函数来构造一个新对象(因此是名称构造函数)。

如果要将此行添加到类Init中构造函数的末尾:

testOne.testing();

你应该在控制台中看到这个:“这是测试方法”。

如果您现在注释掉该行:var testOne : TestOne = new TestOne();并再次运行SWF,则会收到错误消息,告诉您某些内容为空。这是因为您尝试在不存在的对象上调用方法testing

我确实意识到这主要是修复了你的一些编码错误,而不是帮助你理解OOP。但希望你能在对象构建方面获得一些帮助。我看到一些答案已经提到你真正应该研究的关键OOP原则。

编辑:

请记住,复制代码永远不是一件好事,所以如果你发现所有类TestOne - TestFive都包含相同的代码,除了一些细微的细节。你应该将它们改成一个类。

在您的情况下,您可以更改TestOne,以便构造函数接受String,然后在testing函数中,您可以跟踪String。通过将TestOne类更改为以下内容,您可以有效地删除其他4个类。您还在TestOne类中封装了String

package classes {
    import flash.display.MovieClip;

    public class TestOne extends MovieClip {

        private var message : String;

        public function TestOne(myMessage:String) {
            message = myMessage;

            trace("This is TestOne");
        }

        public function testing() : String {
            return message;
        }
    }
}