1
public class ChildClass extends MovieClip
{
   public function ChildClass()
   {
   }

    public function aChildClassFunction()
     {
     }

}

 public class AnotherChildClass extends MovieClip
{
   public function ChildClass()
   {
   }

    public function aChildClassFunction()
     {
     }

}

一些要求 childClass 的随机函数(但懒惰的程序员只使用 MovieClip 类)

    public function setChildClassInstance(var mc:MovieClip) 
    {
// How come "mc" represent and be allowed as parameter ??? It's a super-class.. ie. structurally a sub-set of child-class.

          mc.aChildClassFunction(); //<< Would generate run-time error for 2nd function call. 

    }

上述函数也可用于任何 MovieClip 实例

 var childClassInstance:ChildClass ;
 var anotherChildClassInstance:AnotherChildClass ; 

 setChildClassInstance( childClassInstance )   // <<<<<VALID,  .... NO COMPILER ERROR 

 setChildClassInstance( anotherChildClassInstance )  
  //<<< VALID, NO COMPILER ERROR ..  BUT WILL CAUSE RUNTIME ERROR !!!! 
//
//
//

我想知道,为什么允许超级类(此处为电影剪辑)并将自己表示为子类的参数(此处:ChildClass、AnotherChildClass)。特别是因为,“SUPERCLASSES”实际上是其 PARENT-SET 的“SUB-SET”,即。他们的孩子班。

谢谢

4

1 回答 1

1

使用以下类,您可以假设 Animal 继承了 MovieClip 的所有属性。

package  {
    import flash.display.MovieClip;
    public class Animal extends MovieClip{
        public function Animal(){
            // constructor code
        }
        public function growl():void{
            trace('growl')
        }
    }
}

那么让我们看看MovieClip的继承树

MovieClip->Sprite->DisplayObjectContainer->InteractiveObject->DisplayObject->EventDispatcher->Object

现在我们可以说

Animal->MovieClip->Sprite->DisplayObjectContainer->InteractiveObject->DisplayObject->EventDispatcher->Object<br>

当我们键入将 Animal 的实例转换为 Sprite 时。

var sprite:Sprite = new Animal()

我们丢失了 Animal IE:growl 中定义的方法,
只要我们不尝试访问上面在继承树中定义的任何内容,这一切都很好。
请记住,我们可以键入从树向下投射而不是向上投射。

使用上面的类

var sprite:Sprite = new Animal()
sprite.growl() // this will error since sprite does not contain

现在这里是规则的一个例外。
MovieClip 是动态的,因此类型转换为 MovieClip 不会丢失添加的方法(咆哮)。

var mc:MovieClip = new Animal()
mc.growl() // traces growl

根据定义,动态类不能有与之关联的接口,因为接口是实现它们的类的契约。

于 2013-02-01T19:49:45.313 回答