Actionscript 3 如何在ActionScript3中检查超级类中的子类类型

Actionscript 3 如何在ActionScript3中检查超级类中的子类类型,actionscript-3,Actionscript 3,我想在超级类中得到子类类型。 我试过了 超级班 但是失败了。您的代码可以工作: package{ import flash.display.Sprite; public class TestSuperClass extends Sprite{ public function TestSuperClass(){ super(); trace((new SuperClass).isSubclass); // Outpu

我想在超级类中得到子类类型。 我试过了

超级班 但是失败了。

您的代码可以工作:

package{
    import flash.display.Sprite;

    public class TestSuperClass extends Sprite{
        public function TestSuperClass(){
            super();
            trace((new SuperClass).isSubclass); // Output : false
            trace((new Extended).isSubclass); // Output : true
        }
    }
}

internal class SuperClass
{
    public function get isSubclass() : Boolean{
        return this is Extended;
    }
}

internal class Extended extends SuperClass {}
您可以动态地执行此操作(这很难看,不利于性能,但它可以执行此操作):

您的代码可以工作:

package{
    import flash.display.Sprite;

    public class TestSuperClass extends Sprite{
        public function TestSuperClass(){
            super();
            trace((new SuperClass).isSubclass); // Output : false
            trace((new Extended).isSubclass); // Output : true
        }
    }
}

internal class SuperClass
{
    public function get isSubclass() : Boolean{
        return this is Extended;
    }
}

internal class Extended extends SuperClass {}
您可以动态地执行此操作(这很难看,不利于性能,但它可以执行此操作):


超级班不知道他的子班,也不应该知道。子类扩展了他的超类,因此应该也知道他的超类


你想要达到的目标是不可能的。应该有其他(更好的)方法来解决您的问题/架构。

超级类不知道他的子类,也不应该知道。子类扩展了他的超类,因此应该也知道他的超类



你想要达到的目标是不可能的。应该有其他(更好的)方法来解决您的问题/架构。

您到底想做什么?可能有一种比检查基类类型更好的方法。如果使用“is”关键字不起作用,那么您编写了错误的代码。我认为这实际上会失败,因为“this”是“upcast”到超类型中定义的代码中的超类类型(我不完全确定这一点,因为它没有文档记录,但我遇到过类似的行为,我想知道在超类中创建该类的新实例是否会导致相同的问题,如果您尝试这样做,您需要小心,因为您没有创建无限递归/循环)。抱歉,我的代码中有一个错误。此方法有效。使用重写是一种更好的方法,我正在维护lagecy程序,无法使用重写方法。您到底想做什么?可能有比检查基类类型更好的方法。如果使用“是”关键字不起作用,然后您编写了一些错误的代码。我认为这实际上会失败,因为“this”是“upcast”到超类型中定义的代码中的超类类型(我不完全确定这一点,因为它没有文档记录,但我遇到过类似的行为,我想知道在超类中创建该类的新实例是否会导致相同的问题,如果您尝试这样做,您需要小心,因为您没有创建无限递归/循环)。抱歉,我的代码中有一个错误。此方法有效。使用重写是更好的方法,我正在维护lagecy程序,无法使用重写方法。你是对的,我添加了一种动态执行的方法。我同意这样一个事实,这不好,但你可以执行。你是对的,我添加了一种动态执行的方法。我同意这样的事实很好,但是你能做到。超级班可以知道他的潜艇classes@Simsoft我不同意,我的意思是OP所要求的应该是可能的,但是写一个依赖于它的子类知识的基类并不是一个好的实践,因为你马上就破坏了从这个对象任意扩展的能力t现在不需要进入并修改它的代码(不一定是真的,但它创造了这种可能性).也就是说,这是可能的,但如果有人不理解其中的含义,我不会真的提出建议。我同意,有时它会有用,但你需要小心。这种方式是可行的。我知道这不是一个好主意,我有一些限制,所以我必须用这种方式。超级阶级可以知道他的下属classes@Simsoft我不同意我的意思也就是说,OP所要求的应该是可能的,但是编写一个依赖于它的子类知识的基类并不是一个好的实践,因为您立即破坏了从该对象任意扩展的能力,而不需要进入并修改它的代码(不一定是真的,但它创造了这种可能性)。也就是说,肯定这是可能的,但如果有人不理解其中的含义,我不会真的建议。我同意,有时候它可能有用,但你需要小心。这种方式是行得通的。我知道这不是一个好主意,我有一些限制,所以我不得不采用这种方式。
package{
    import flash.display.Sprite;

    public class TestSuperClass extends Sprite{
        public function TestSuperClass(){
            super();

            trace((new SuperClass).isSubclass); // Output : false
            trace((new SuperClass).superClass); // Output : Object
            trace((new Extended).isSubclass); // Output : true
            trace((new Extended).superClass); // Output : SuperClass
        }
    }
}
import flash.utils.describeType;

internal class SuperClass
{
    public function get isSubclass() : Boolean{
        return describeType(this).@base.toString() != "Object";
    }

    public function get superClass() : String
    {
        return describeType(this).@base.toString().split("::").pop();
    }
}

internal class Extended extends SuperClass {}