2012-01-09 6 views
1

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

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

Способ, которым я в настоящее время это делаю, ссылаясь на экземпляр этапа, связанный с 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, мне кажется, что я нашел решение, которое наилучшим образом соответствует моим потребностям.

в ClassB:

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 
+1

Возможно, было бы лучше решить его по-другому. Обычно полезно стремиться к созданию инкапсулированных и развязанных классов. Отправьте некоторый код, и мы сможем предложить улучшения :) –

+0

Я бы разместил код, над которым я работаю, но это очень сложная структура загрузчиков, и я считаю, что в итоге это было бы неважно, вместо этого я попробуйте указать, что я ищу, с помощью простого кода примера (добавленного как редактирование вопроса). Спасибо, Джонатан! – IneedHelp

ответ

1

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

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

в ClassB:

StaticRegister.assign(this); 

в StaticRegister:

publis static var register : Array = []; 

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

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

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

В ClassB:

private static var instance : ClassB; 

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

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

public class ClassB() { 
    instance = this; 
} 

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

+0

Привет, Даниэль. Я немного смущен главным образом в отношении точки C). Разве «публичный статический класс» не является «публичным статическим классом»? Кроме того, я думал, что ключевое слово this не принимается в статических функциях. – IneedHelp

+0

Возможно ли, что я испортил это: D. Я был в спешке, исправлен, извините :) –

+0

Я заметил ваше изменение, а затем ваш комментарий к следующему человеку, который ответил: D. Спасибо за информацию! – IneedHelp

2

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

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

+0

Yup! ______1UP. – IneedHelp