0

我有以下情况:

我有一个 MovieClip,我为它创建了一个名为 A 的链接。

class A extends B{

}

class B extends C {
}

class C extends MovieClip {

  public function C() {
  // from the constructor of C i want to be able to reach the elements in Class a.
  // for example I have some text elements that I want to change.
  //  super.super is not allowed. 

  }

}

什么是允许的?我该如何解决这个问题?

更新

好的,这是一个确切的场景,但我仍然无法解决一个更简单的场景。

最初的场景是我有一个名为的 MovieClip user_bg_me,它有一个名为user_bg_meextends的链接,user_bg_generic它扩展了“MovieClip”

user_bg_generic类内部,我希望能够修改影片剪辑本身内部的元素。使用 super.element_name 会提供找不到属性的错误。

有任何想法吗?

4

2 回答 2

2

我认为您可能对继承的工作方式感到困惑;特别是 Parent 和 Child 类之间的关系。

父类可以以子类可以使用的方法和属性的形式公开行为,这里有一个非常简单的例子:

public class Parent {
    // Constructor for the Parent Class.
    public function Parent() {
    }

    protected function sayHello() : void {
        trace("Hello!");
    }
}

我们现在可以创建这个 Parent 类的子类,它将获得 Parent 的可见行为(函数和属性):

public class Child extends Parent {
    // Constructor for the Child Class.
    public function Child() {
        // Call the 'parent' classes constructor.
        super();

        // This child class does not define a function called "sayHello" but
        // the Parent class which this Child class extends does, and as a result
        // we can make a call to it here.  This is an example of how the child Class
        // gains the behaviours of the Parent class.
        this.sayHello();
    }

    public function sayGoodbye() : void {
        trace("Goodbye!");
    }
}

现在,这种关系(子类可以访问它们扩展的父类的功能和属性)仅以一种方式起作用。也就是说,Parent 类不知道其子类可能选择声明的函数和属性,因此,以下代码将不起作用:

public class Parent {
    public function Parent() {
        // Trying to call the sayGoodbye() method will cause a compilation Error.
        // Although the "sayGoodbye" method was declared in the Child class, the
        // Parent Class has no knowledge of it.
        this.sayGoodbye();
    }
}

现在,让我们看看我们如何解决您尝试从父类访问属于 FLA 中的实例的 TextField 的问题:

// it is important to note that by extending the MovieClip class, this Parent Class now
// has access to all the behaviours defined by MovieClip, such as getChildByName().
public class Parent extends MovieClip {
    // This is a TextField that we are going to use.
    private var txtName : TextField;

    public function Parent() {
        // Here we are retrieving a TextField that has an instance name of txtName
        // from the DisplayList.  Although this Parent Class does not have  a TextField
        // with such an instance name, we expect the children that extend it to declare
        // one.
        txtName = this.getChildByName("txtName") as TextField;

        // Check to see if the Child class did have an TextField instance called 
        //txtName.  If it did not, we will throw an Error as we can not continue.
        if (txtName == null) {
            throw new Error("You must have a TextField with an instance name of 'txtName' for this Parent Class to use.");
        }

        // Now we can make use of this TextField in the Parent Class.
        txtName.text = "Hi my name is Jonny!";
    }
}

您现在可以在您的 FLA 中拥有尽可能多的实例,这些实例通过链接扩展此父类。您只需要确保他们有一个实例名称为“txtName”的 TextField,这样父类就可以完成它的工作。

希望这可以帮助 :)

于 2011-05-08T15:44:41.670 回答
2

你的层次结构倒退了。C 类不能访问 A 的成员,因为 A 是 C 的子类,而不是相反。C 类中的“super.super”即使有效,也不会得到你想要的,因为它会引用 MovieClip 扩展的 Sprite 类。

Sprite -> MovieClip -> C -> B -> A 是你的层次结构

更重要的是,您通常不需要super关键字来访问超类成员。当您用同名的子类成员覆盖超类成员并且需要区分时,您只需要关键字。如果没有任何命名冲突,您可以在没有super或类名限定符的情况下访问超类的公共和受保护成员。如果你真的认为你需要 super.super,你需要重新考虑你的继承设计。

于 2011-05-08T16:13:54.820 回答