AS3: доступ к свойству или функции объекта в расширенном классе, который не входит в суперкласс - PullRequest
0 голосов
/ 29 января 2012

Если у меня есть три класса:

public class Example {
   public function Example () {

   }
}

public class ExtendedExample extends Example {
   public function func ():void {
        //here is what this class does different that the next
   }
   public function ExtendedExample () {

   }
}

public class AnotherExtendedExample extends Example {
   public function funct ():void {
       //here is what this class does, and it is differente from ExtendedExample
   }
   public function AnotherExtendedExample () {

   }
}

Вы можете видеть, что два последних класса расширяют первый, и оба имеют свойство 'variable'.В случае, если у меня есть экземпляр Example, и я уверен, что это также экземпляр ExtendedExample ИЛИ AnotherExtendedExample, есть ли способ доступа к свойству 'variable'?Что-то вроде

function functionThatReceivesAnExtendedExample (ex:Example):void {
    if(some condition that I may need) {
        ex.func()
    }

}

Ответы [ 3 ]

1 голос
/ 29 января 2012

@ Лукас измени свой код, как показано ниже

function functionThatReceivesAnExtendedExample (ex:Example):void {
    if(ex is ExtendedExample) {
        (ex as ExtendedExample).func()
    } else if(ex is AnotherExtendedExample)
    {
        (ex as AnotherExtendedExample).funct() 
    }
}

надеюсь, это поможет

1 голос
/ 29 января 2012

Если переменная используется в некоторых ваших подклассах, но не во всех из них, и вы не определили ее в родительском классе, вы все равно можете попытаться получить к ней доступ. Я бы предложил несколько быстрых кастингов:

if (ex is AnotherExtenedExample || ex is ExtendedExample)
{
    var tmpex:ExtendedExample = ex as ExtendedExample;
    trace (tmpex.variable);
}

Вы также можете привести его к динамическому типу объекта и попытаться получить доступ к свойству в блоке try..catch. Я бы порекомендовал использовать приведение как выше, где логика легче следовать.

Если переменная используется во всех подклассах, просто определите ее в родительском классе и присвойте ей конкретное значение в каждом подклассе.

0 голосов
/ 29 января 2012

Как говорит RIAstar в своих комментариях, самым очевидным способом было бы заставить Example также иметь функцию func и переопределить ее в подклассах.

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

public class Example {
    public function Example () {

    }
}

public interface IFunc {
    function func():void;
}

public class ExtendedExample extends Example implements IFunc {
    public function func ():void {
        //here is what this class does different that the next
    }
}

public class AnotherExtendedExample extends Example implements IFunc {
    public function func ():void {
        //here is what this class does, and it is differente from ExtendedExample
    }
}

function functionThatReceivesAnExtendedExample (ex:IFunc):void {
    ex.func()
}
...