我正在努力更好地理解AS3 OOP结构和组织,但是我遇到了一些问题。我想创建多个类文件,似乎最佳做法是不将所有类放在一个文件中?我在网上搜索了几个小时,并提出了一些很好的例子。使用AS3时可能不是单独的文件,但对我来说,它只对模块化有意义。我一直在玩的文件是:
我创建了一个名为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
答案 0 :(得分:2)
看看Flex SDK coding conventions and best practices可能会很好。这是一个逐点概述你应该如何使用ActionScript 3.整个过程中分散了大量的OOP内容,因此请仔细浏览它。我认为值得任何新的或经验丰富的AS3开发人员阅读,因为那里有很多有用的信息。
答案 1 :(得分:1)
OOP是一个很大的主题,但here is a good primer。
答案 2 :(得分:1)
答案 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;
}
}
}