【问题标题】:Var mistakenly resets itself in AS3var 在 AS3 中错误地重置了自己
【发布时间】:2015-08-21 20:36:48
【问题描述】:

我是 AS3 的新手。我有 2 个文件:

main.as:

package
{
    import flash.display.*;
    public class Main extends Sprite 
    {
        public function Main()
        {
            var f0:Flower = new Flower("rose");
            var f1:Flower = new Flower("daisy");    
        }
    }
}

花.as:

package 
{
    public class Flower 
    {
        public var namex:String; 
        public function Flower(name:String) 
        {
            trace("Previous public var name: " + namex);
            namex = name; 
        }
    }
}

基本上,我的输出中有 2 个空值。第一个我明白为什么;当我第一次触发时

var f1:Flower = new Flower("rose");

它调用花的函数并要求跟踪尚未设置的var,因此我们得到一个null。在跟踪之后,它设置了 var

namex = name;

这是值字符串rose。但是,当我触发花雏菊时,我应该(在我看来)收到这条消息:“Previous public var: rose”,因为当我们触发玫瑰时,我们告诉他将 public var namex 设置为我们首先设置的值主要供应(玫瑰)。 那么为什么我得到 2 个 null 而不是 1 个 null,另一个不应该是“Previous public var: rose”;

另外一件事,我能清楚地解释一下是什么

var f1:Flower = new Flower("rose");

确实如此吗?它会创建一个对象吗?一个实例?还是只为flower.as中的函数提供一个值(玫瑰)?

【问题讨论】:

  • 阅读 AS3 OOP 教程。这是基本的 OOP 东西。只有静态变量在类实例之间共享。您的 namex 变量未设置为静态...因此 Flower 类的每个实例都不同。
  • 一旦在 main.as 中触发,这些实例是否会保存在某个地方?实例到底是什么?价值“上升”?正如我所说,我是初学者;这对我来说不是基本的。顺便说一句,我将 public var 设置为“public static var”,现在出现错误:null。

标签: actionscript-3 class var


【解决方案1】:

您的代码:
var f1:Flower = new Flower("rose");

创建Flower 类型对象的新实例并将其分配给变量f1。它将字符串“rose”传递给Flower类的构造函数。

正如 lansen 所说,Flower 的每个实例都有其自己的具有独立值的 namex 变量。

在这一点上,我认为如果你退后一步,学习一些面向对象编程的基础知识,而不是把头撞在你没有基本理解的东西上,会更有效率。这本书是一个很好的起点:Essential ActionScript 3.0。

【讨论】:

  • 书籍推荐加1。获得一份使用过的副本可能是个好主意。
  • 我会看看那本书,但是类型“花”是什么意思?我的意思是,我知道有一些类型叫做“MovieClip”、“Button”、“Graphic”等等……只是不确定当你给对象名称一个同名的类型时它会做什么。
【解决方案2】:

在这里查看基本 OOP 教程:http://tv.adobe.com/watch/actionscript-11-with-doug-winnie/objectoriented-programming-episode-45/

Doug Winnie 解释它非常简单和好方法 ;)

【讨论】:

    【解决方案3】:

    但是类型“花”是什么意思?我的意思是,我知道有一些类型 称为“MovieClip”等......只是不确定当你给它时它会做什么 对象名同名类型

    如果您的代码看起来像这样,对您来说可能更有意义..?

    import flash.display.*;
    import Flower;
    

    但这里不需要“导入”Flower,所以它仍然有效。一切都以代码的形式存在,所以在幕后想象当您创建一个新的MovieClip 类型变量时,Flash 会使用“MovieClip.as”文件。高级编码人员甚至可以用他们自己定制的同名函数等覆盖内置函数。

    所以典型的代码是:variable Name : Type = new Type();

    Type() 中的括号/大括号;告诉我们它是一个函数,所以现在代码将运行一个与 Type 同名的函数,这在您的 Main.as 代码中意味着执行此操作..“我的变量 f1 是由 @987654325 制成的@由函数public function Flower (name:String)"。在这里,您正在“初始化”变量/类型,以便从现在开始,您可以在不同的引用名称下创建相同代码的多个 AND “唯一”实例。

    看看这个示例代码是否对您有帮助...(还显示了如何在两个类之间传递和检索信息的基本方法
    Main.as

    package
    {
    
    import flash.display.*;
    
    public class Main extends Sprite 
    {
        public var f0 : Flower = new Flower("rose");
        public var f1 : Flower = new Flower("daisy");  
    
        public function Main()
        {
            Do_Something1 (); //runs a function called...
        }
    
        public function Do_Something1 () : void
        {
            //trace namex directly from Flower class
            trace("new f0 namex: " + f0.namex );
            trace("new f1 namex: " + f1.namex );
    
            //now change the contents of "namex" String in Flower class 
            f0.namex = "violet"; f1.namex = "bluebell";
    
            //run function from each instance of Flower class
            f0.check_renamed_Flower();
            f1.check_renamed_Flower();
    
        }
    
    } //end class Main
    } //end package
    

    Flower.as

    package 
    {
        public class Flower 
        {
            public var namex : String; 
    
            public function Flower( F_name:String) : void 
            {
                trace("Previous public var name: " + F_name);
                namex = F_name; 
            }
    
            public function check_renamed_Flower() : void 
            {
                trace( "changed var name: " + namex );          
            }
        }
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多