私有函数被继承

时间:2014-06-30 20:27:12

标签: actionscript-3 flash oop inheritance actionscript

这是非常自我解释的,但是我在Subclass中的代码继续在超类中继承私有函数,我相信这是一个非常大的问题。

你认为你可以解码为什么我的代码上的私有函数被从超类继承到子类中吗?

超级班:

package  {

    import flash.display.MovieClip;
    import flash.events.Event;

    public class Level1 extends MovieClip {

        public static var rightSide:Boolean;
        public static var leftSide:Boolean;

        public function Level1() {
            // constructor code
            stage.addEventListener(Event.ENTER_FRAME, loop)
        }
        public function loop(e:Event){
            trace("x is" + x)
            endofGround();
            hhh();
            //if they are left or right move the ground in proportion to their speed
            if(rightSide){x-=Okechuku.speedX; trace("right")}
            if(leftSide){x+=Okechuku.speedX; trace("left")}
        }
        private function endofGround(){
            //if((x>=1720.35) || (x<=-81.5)){trace("LOOOL");}
            if(x>=1720.35){trace("TOO FAR LEFT");}
            if(x>=1){trace("TOO FAR RIGHT");}
            scaleY=2

        }
        private function hhh():void{
            rotation+=1;
        }
    }

}

子类:

package  {

import flash.display.MovieClip;
import flash.events.MouseEvent;
import fl.transitions.Tween;
import fl.transitions.TweenEvent;
import fl.transitions.easing.*;


public class PassPort extends Level1 {



    var shrink:Tween;
    public function PassPort() {
        // constructor code
        super();
        addEventListener(MouseEvent.MOUSE_OVER, highLight)
        addEventListener(MouseEvent.MOUSE_OUT, unhighlight)
        addEventListener(MouseEvent.CLICK, gotit)
    }
    function highLight(me:MouseEvent){
        pp.gotoAndStop(2);
    }
    function unhighlight(me:MouseEvent){
        pp.gotoAndStop(1);
    }
    function gotit(c:MouseEvent){
        shrink = new Tween(this,"scaleX", Regular.easeInOut,1,0,20)
        shrink.addEventListener(TweenEvent.MOTION_FINISH, removePp)
        removeEventListener(MouseEvent.CLICK, gotit)
    }
    function removePp(t:TweenEvent){
        MovieClip(root).objtxt.text = "Objective: Get to the Airport.";
        MovieClip(parent).removeChild(this);
    }

}

}

3 个答案:

答案 0 :(得分:3)

当你继承一个类时,超类中的所有方法和变量仍然存在(无论它们是如何声明的)。如果它们被声明为private,它们就变得无法访问子类。

基类构造函数仍然运行,如果它调用私有函数,它们仍然会执行。

如果你想改变子类中发生的事情,那么你需要覆盖那个方法(然后替换旧方法 - 尽管仍然可以使用super关键字访问旧方法。) / p>


修改

以下是您可能会发现有用的示例

public class BaseClass {
    public function BaseClass(){
        init();
    }

    protected function init():void {
        myPrivateFunction();
    }

    private function myPrivateFunction():void {
        trace("PrivateFunction!!!");
    }
}

public class SubClass1 extends BaseClass {
    public function SubClass1(){

    };
}

public class SubClass2 extends BaseClass {
    public override init():void{
        trace("No private function running here");
    }
}

在上面的示例中,实例化SubClass1会导致跟踪&#34; PrivateFunction !!!&#34; - 因为基类构造函数仍然运行并执行它的代码是私有的或其他方式。

然而,

实例化SubClass2会导致没有私人函数在这里运行&#34; 的痕迹,因为它会覆盖现在不再调用的init()方法来自基类的私有函数。在SubClass2中,您还可以调用super.init()来继续运行基类方法(然后调用输出原始跟踪的私有方法)。

答案 1 :(得分:1)

私有方法不会被继承。它们存在于超类中,但在子类中不可访问。

来自超级阶级的私人方法/变种不仅神奇地消失了。如果你在超级班中有这个,你认为会发生什么:

public function doSomethingPublic():void {
   doSomethingPrivate();
}

private function doSomethingPrivate():void {
  //do something
}

然后从你的子类中调用super.doSomethingPublic()?现在这将是一个非常奇怪的场景......它应该抛出错误或应该发生什么? 当然不应该。它将简单地调用doSomethingPrivate(),因为此函数存在于超类中。

答案 2 :(得分:0)

你误解了私有方法的使用。它们将始终存在于超类中,并最终在内部调用时运行。如果要阻止私有方法运行,则它不应该是私有的,而是受保护的。受保护的方法就像私有方法,除了它们是继承的,因此可以被覆盖。覆盖方法允许您实现不同的功能或完全关闭该方法(您覆盖但不添加代码=方法关闭)。