AS3 1120实例化时出错

问题描述:

我正在尝试在AS3中创建基本功能。AS3 1120实例化时出错

我有这样一个类:

package tax 
{ 
    public class Calculator 
    { 

     public function Calculator() 
     { 
     } 

     private var grwage:Number; 
     private var taxes:Number; 
     private var superannuation:Number; 
     private var insurance:Number; 
     private var net:Number; 

     public function getGrwage():Number { 
      return grwage; 
     } 

     public function setGrwage(grwage:Number):void { 
      this.grwage = grwage; 
     } 

     public function getTaxes():Number { 
      return grwage; 
     } 

     public function setTaxes(taxes:Number):void { 
      this.taxes = grwage * 0.2; 
     } 

     public function getSup():Number { 
      return superannuation; 
     } 

     public function setSup(superannuation:Number):void { 
      this.superannuation = superannuation * 0.05; 
     } 

     public function getIns():Number { 
      return insurance; 
     } 

     public function setIns(insurance:Number):void { 
      this.insurance = insurance * 0.1; 
     } 

     public function getNet():Number { 
      return net; 
     } 

     public function setNet(net:Number):void { 
      this.net = grwage - taxes - superannuation - insurance; 
     } 

    } 
} 

只是一些getter和setter。

在我的MXML文件:

 import tax.Calculator; 

        public var calculate:Calculator = new Calculator(); 

     calculate.setGrwage(1000); 
     trace(calculate.getTaxes()); 
     trace(calculate.getSup()); 
     trace(calculate.getIns()); 
     trace(calculate.getNet()); 

我得到一个错误1120访问undefinded财产时,我尝试访问计算。你有什么想法?

谢谢。

+0

什么的'setTaxes点(税:号码)'如果不使用给定的参数? – Kodiak 2011-04-12 12:58:56

+0

究竟是哪一个呢?你能从编译器中粘贴完整的错误吗? – Chris 2011-04-12 13:04:01

+1

你可以看到你的代码在语法上没有任何错误,但你对getter和setter应该做什么有一些困惑,并且只是像getTaxes()返回grwage而不是税的基本错误,setTaxes()和setNet()实际上不是制定者;如果它们用于计算和存储结果,则应该调用calculateTaxes()和calculateNet()。另外,你的代码示例会在你运行时跟踪1000,NaN,NaN,NaN,因为你得到的东西没有被设置(只有grwage被设置)。 – 2011-04-12 13:38:18

我想你在吸气者和安装者之间混合了一些东西。如果一个变量依赖于另一个变量,则必须将计算结果写入其吸气器中。这个变量不应该作为私有成员存在,并且访问它必须始终通过适当的getter来完成。

例如:

public function getNet():Number { 
    return getGrwage() - getTaxes() - getSup() - getIns(); 
} 

所以在这里,你只需要一个二传手(setGrwage),你可以删除那些人,把计算的干将。

请注意,对于AS3中的setter和getter,有一个更合适的syntax

class GetSet 
{ 
    private var privateProperty:String; 

    public function get publicAccess():String 
    { 
     return privateProperty; 
    } 

    public function set publicAccess(setValue:String):void 
    { 
     privateProperty = setValue; 
    } 
} 
+0

谢谢科迪亚克,我改变了我的班级。但是我仍然遇到实例化的问题。它说“1120访问未发现财产计算”。 – Chrisissorry 2011-04-12 15:42:44

+0

您发布的代码是否在您的mxml中?您应该将代码(从calculate.setGrwage开始)放入事件侦听器(如creationComplete)中。 – Kodiak 2011-04-12 16:01:35

您的班级有多个问题。因此让我们重新设计它
您遇到的主要问题是您在访问它们之前没有启动变量,因为它们有一个NULL值,Flash Player向您抛出该错误。 正如你可以在构造函数中看到的,我设置了一个默认值0,以便它们永远不会为NULL。

package tax { 
    public class Calculator{ 

     private var _grwage:Number; 
     private var _taxes:Number; 
     private var _superannuation:Number; 
     private var _insurance:Number; 

     public function Calculator() { 
      this._grwage = 0; 
      this._taxes = 0; 
      this._superannuation = 0; 
      this._insurance = 0; 
     } 

     public function get grwage():Number { 
      return this._grwage; 
     } 

     public function set grwage(val:Number):void { 
      this._grwage = val; 
     } 

     public function get taxes():Number { 
      return this._taxes; 
     } 

     public function set taxes(val:Number):void { 
      this._taxes = val * 0.2; 
     } 

     public function get superannuation():Number { 
      return this._superannuation; 
     } 

     public function set superannuation(val:Number):void { 
      this._superannuation = val * 0.05; 
     } 

     public function get insurance():Number { 
      return this._insurance; 
     } 

     public function set insurance(val:Number):void { 
      this._insurance = val* 0.1; 
     } 

     public function get net():Number { 
      return this._grwage - this._taxes - this._superannuation - this._insurance; 
     } 

    } 
} 


import tax.Calculator; 
    public var calculate:Calculator = new Calculator(); 
    //Now due to the fact we are using true setter/getter methods. 
    calculate.grwage = 1000; 
    trace(calculate.taxes); // should be 0 as we are defaulting to the initial value 
    trace(calculate.superannuation);// should be 0 as we are defaulting to the initial value 
    trace(calculate.insurance);// should be 0 as we are defaulting to the initial value 
    trace(calculate.net);// should be 1000 as we are defaulting to the initial values of everything but grwage 

这里的答案都是不错的,但他们都错过了主要点:

你试图设置他们之前得到你的变量。

import tax.Calculator; 

public var calculate:Calculator = new Calculator(); 

calculate.setGrwage(1000); 
trace(calculate.getTaxes()); 
trace(calculate.getSup()); 
trace(calculate.getIns()); 
trace(calculate.getNet()); 

这将抛出一个错误(因为你已经设置了类的方式),因为你永远不试图使用他们之前叫setSup()setIns()setNet()

虽然你的课程可能不是以最好的方式书写,但它在语法上是合理的。

尝试在你的获得者之前调用每个setter。我想你会解决你的问题。