Как получить доступ к свойствам и методам класса без расширения или создания экземпляров? - PullRequest
1 голос
/ 09 января 2012

Допустим, у меня есть определенный ClassA. ClassB расширяет ClassA, и на сцене есть экземпляр Movie Clip, связанный с ClassB.

Как ClassC получит доступ к свойствам и методам ClassB без расширения ClassB или создания нового экземпляра ClassB?

В настоящее время я делаю это, ссылаясь на экземпляр stage, связанный с ClassB, а затем используя точечный синтаксис для доступа к переменным экземпляра ClassB, и это работает только в том случае, если доступные переменные являются общедоступными или внутренними, в зависимости от того, какой пакет ClassC является частью. Я хотел бы знать, есть ли лучший, более чистый способ сделать это.

Редактировать: Пример кода.

package com.core.stage.classes {

    import flash.display.MovieClip;

    public class ClassA extends MovieClip {

        public var classAvar:uint = 0;

        public function ClassA() {

        }

        protected function classAfunction(funPar:uint):void {
            classAvar = 2 * funPar;
        }

    }

}

package com.core.stage.classes {

    import com.core.stage.classes.ClassA;

    public class ClassB extends ClassA {

        public function ClassB() {
            classAfunction(10);
        }

    }

}

package com.core.stage.classes {

    import flash.display.MovieClip;

    public class ClassC extends MovieClip {

        private var classBreference:*;

        public function ClassC() {
            classBreference = Object(parent);
            trace(classBreference.classAvar); // Outputs 20.
        }

    }

}

Итак, в основном я хочу знать, есть ли лучший способ получить значение classAvar (которое было объявлено в ClassA, получено после вызова метода в ClassB) при работе в ClassC.

Решено:

Хорошо, после некоторого исследования и идеи, которую я получил от daniel.sedlacek, кажется, что я нашел решение, которое наилучшим образом соответствует моим потребностям.

в классе B:

private static var _instance:ClassB;

public function ClassB() { // constructor
    _instance = this;
}


public static function get FUN_GetInstance():ClassB {
 return _instance; 
}

в ClassC:

private var MC_VariablesContainer:ClassB
MC_VariablesContainer:MC_ClassB = ClassB.FUN_GetInstance

Ответы [ 2 ]

2 голосов
/ 09 января 2012

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

Это один из базовых принципов ООП. Вы не можете получить частные и защищенные свойства или методы. Если вы хотите получить их, вы должны сделать их общедоступными или внутренними.

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

A) Не делайте этого, подумайте о лучшей архитектуре, которая будет учитывать слабую связь инкапсуляции.

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

в классе B:

StaticRegister.assign(this);

в StaticRegister:

publis static var register : Array = [];

public static function assign(instance : Object) : void {
   array.push(instance);
}

А затем вытащите его оттуда подобным образом. Но это действительно грязно делать это так.

С) Если есть только один экземпляр ClassB, вы можете присвоить ему статические - синглтоноподобные - средства доступа:

В классе B:

private static var instance : ClassB;  

publis static function getInstance() : ClassB {
  return instance;
 }

В конструкторе:

public class ClassB() {
   instance = this;
}

Подробнее о полных синглетонах: www.actionscript.org или Google или Wikipedia.

...