Как я могу добраться до текстовых элементов суперкласса? - PullRequest
0 голосов
/ 08 мая 2011

У меня следующий сценарий:

У меня есть мувиклип, и я создал для него связь с именем 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. 

  }

}

что разрешено?как я могу решить проблему?

update

хорошо, это точный сценарий, но более простой, который я все еще не смог решить.

Исходный сценарийявляется то, что у меня есть MovieClip с именем user_bg_me, который имеет связь с именем user_bg_me, которая расширяет user_bg_generic, который расширяет 'MovieClip`

внутри user_bg_generic класса, я хочу иметь возможность изменять элементы внутри фильмаклип сам.Использование super.element_name приводит к ошибке, что свойство не найдено.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

У вас есть ваша иерархия в обратном направлении. Класс C не может получить доступ к членам A, потому что A является подклассом C, а не наоборот. «super.super» из класса C не даст вам того, что вы хотите, даже если он будет работать, потому что он будет ссылаться на класс Sprite, который расширяет MovieClip.

Sprite -> MovieClip -> C -> B -> A - это ваша иерархия

Что еще более важно, вам обычно не нужно ключевое слово super для доступа к членам суперкласса. Ключевое слово требуется только в том случае, если вы переопределили членов суперкласса членами одного и того же имени, и вам нужно провести различие. Если нет никаких конфликтов имен, вы можете получить доступ к открытым и защищенным членам суперкласса без super или квалификатора имени класса. Если вы действительно думаете, что вам нужен super.super, вам нужно пересмотреть свой дизайн наследования.

2 голосов
/ 08 мая 2011

Я думаю, вы можете запутаться из-за того, как работает наследование;в частности, отношения между родительским и дочерним классами.

Родительский класс может представлять поведение в форме методов и свойств, которые могут использовать подклассы child , вот очень простой примерчто в действии:

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

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

Теперь мы можем создать дочерний класс этого родительского класса, который получит видимое поведение (функции и свойства) родителя:

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!");
    }
}

Теперь это соотношениегде дочерние классы могут получить доступ к функции и свойствам родительских классов, которые они расширяют, работает только в одном направлении.То есть родительский класс не знает функций и свойств, которые его дети могут выбрать для объявления, поэтому в результате следующий код не будет работать:

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();
    }
}

Теперь давайте посмотрим накак мы могли бы решить вашу проблему, пытаясь получить доступ к TextField, который принадлежит экземпляру в FLA из родительского класса:

// 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, сколькорасширить этот родительский класс.Вам просто нужно убедиться, что у них есть TextField с именем экземпляра 'txtName', чтобы родительский класс мог делать свое дело.

Надеюсь, это поможет:)

...