【问题标题】:Is there a way to subclass and override a method that is in a custom namespace?有没有办法子类化和覆盖自定义命名空间中的方法?
【发布时间】:2011-03-24 16:43:00
【问题描述】:

假设我有一个类,其方法定义在公共、受保护或内部以外的命名空间中......

package com.foo.bar
{
   import com.foo.my_name_space
   public class bar
   {
    private var _vabc:String
    private var _v123:String

    protected function set123(val:String):void{
        _v123 = val;
    }

    my_name_space function setABC(val:String):void{
        _vabc = val;
    }

   }
}

现在我想在子类中扩展和覆盖它...

package com.foo
{
   import com.foo.bar.bar
   import com.foo.my_name_space

   public class foo extends bar
   {
      override protected function set123(val:String):void{
        super.set123(val);
      }

       .... ????? ...

   }
 }

很容易覆盖受保护的、公共的等方法,但是有没有办法覆盖命名空间 *my_name_space* 中定义的 setABC 方法?

我尝试了以下语法,似乎通过了 FlashBuilder 预编译器检查但不起作用。

    use namespace my_name_space override function my_name_space::setABC(val:String):void

我尝试了许多其他语法组合,但大多数都没有通过预编译检查。 (许多有某种类型的命名空间错误)我觉得这是不可能的,但想知道是否有人有任何想法?

【问题讨论】:

  • 你是如何声明你的命名空间的?我们可以看看代码吗?谢谢。

标签: flash actionscript-3 actionscript flex3 flex4


【解决方案1】:

詹姆斯的回答是对的。您只是未能适当地添加 use namespace 指令。此示例按预期工作:

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import test.Base;
    import test.Child;
    import test.my_namespace;

    public class Main extends Sprite {

        use namespace my_namespace;

        public function Main():void {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point

            var base:Base = new Base();
            base.test();

            var child:Child = new Child();
            child.test();
        }

    }

}

package test {
    import test.my_namespace;
    use namespace my_namespace;

    public class Base {

        my_namespace function test():void {
            trace("Base");
        }

    }

}

package test {
    import test.Base;
    import test.my_namespace;
    use namespace my_namespace;

    public class Child extends Base {

        public function Child() {

        }

        override my_namespace function test():void {
            trace("Child");
            super.my_namespace::test();
        }
    }

}

package test {
    public namespace my_namespece;
}

【讨论】:

  • 同意。我也是这么想的,把它作为评论发布。感谢您提供完整的实现。
  • 除此之外,我想(礼貌地)提醒贾斯汀,不要对试图帮助你的人如此刻薄,还要记下人们的答案。我们都在这里学习。
  • 我向@james-lyon 道歉并删除了我的评论我通常不是最热情和最模糊的人。
【解决方案2】:

这应该可以工作

override my_name_space function setABC(val:String):void
{   
}

【讨论】:

  • 他实际上可能是对的。根据我所做的研究,这是从自定义命名空间覆盖方法的正确方法。确保您在类中的此覆盖之前的某处调用“使用命名空间 my_namespace”。如果这对您不起作用,那么您可能已将命名空间定义为私有命名空间。
  • 很抱歉不能将此标记为答案,因为它不完整。如果您还使用“使用命名空间”指令,则此语法将起作用。
猜你喜欢
  • 2010-09-06
  • 2020-03-12
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2013-09-11
  • 2020-08-29
  • 2020-08-02
相关资源
最近更新 更多