我正在尝试重写子类的方法,但我认为我需要访问层次结构中更高的父类(super class)。所以我想做一些类似 super.super.methodName();
仅供引用,我试图解决的实际问题应该由下面的代码解释:
public class A extends UIComponent{
override protected function keyDownHandler(event:KeyboardEvent):void{
super.keyDownHandler(event);
if(event.keyCode==46)
remove();
}
}
public class B extends A{
override protected function keyDownHandler(event:KeyboardEvent):void{
if(event.keyCode==46 && removeable==true)
remove();
else
super.super.keyDownHandler(event);
}
}
如果我使用类 A 的 KeyDownHandler 方法,您将看到无论如何都会调用remove()。但是,文档指出,每当我子类化 UIComponent 时,我都需要调用 UIComponent.keyDownHandler。当然,这适用于第一个子类,但不适用于该子类的子类。
我意识到我可以将所有功能放入 A 中,例如 如果(这是 B){...} 但在我看来,这似乎是一种黑客行为。
最佳答案
您可以向类 A 添加另一个方法,我们将其称为 superKeyDownHandler,其唯一目的是调用父类(super class)中的某些方法。
protected function superKeyDownHandler(event:KeyboardEvent):void{
super.keyDownHandler(event);
}
然后你想要实现的目标就像调用一样简单
super.superKeyDownHandler(event);
这只是一种解决方法,但不是真正的干净解决方案,因此使用它需要您自担风险:)
更新:
也许更干净的东西会涉及覆盖 A 类的 keyDownHandler 内容。因此,在 A 类中,您将拥有:
public class A{
override protected function keyDownHandler(event:KeyboardEvent):void{
super.keyDownHandler(event);
overridableContent();
}
protected function overridableContent(){
//do class A specific things here
if (event.keyCode==46)
remove();
}
}
public class B extends A{
override protected function overridableContent(){
//do class B specific things here
if (event.keyCode==46 && removeable==true)
remove();
}
}
现在调用诸如 new B().keyDownHandler(event)
之类的内容将导致调用 keyDownHandler,因为它是在类 A 中定义的,内容取自类 B。
关于apache-flex - 是否可以在 flex/as3 中访问父类(super class)的父类(super class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4713586/