Создание публичной функции в объектно-ориентированном программировании (flash)? - PullRequest
1 голос
/ 25 июня 2009

Я новичок в объектно-ориентированном программировании и flash. Насколько я знаю, глобальные переменные и функции - это зло. Мы должны использовать объекты, верно?

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

Проблема в том, что мне нужно иметь возможность использовать эту функцию журнала везде, у детей, у детей этих детей, у родителей этих детей и т. Д. - где угодно в коде.

Как мне сделать это в хорошем объектно-ориентированном виде? Потому что этот объект больше не будет доступен, когда я вызову его в объекте A и захочу использовать его в дочернем объекте A, который является объектом B.

Ответы [ 3 ]

3 голосов
/ 25 июня 2009

Много разных способов, конечно, в зависимости от деталей вашего приложения. (И глобальные переменные по определению не являются «злыми» - на самом деле во Flash они могут быть весьма полезны.) Один из подходов заключается в определении общедоступного статического метода, который можно вызывать из любого места в вашем коде, и это определяется как отдельный класс, например:

package
{
    public class MyCustomLogger
    {
        public function MyCustomLogger()
        {
            //
        }

        public static function log(text:String):void
        {
            trace(text);
        }
    }
}

Определенный таким образом, вы можете вызывать функцию журнала с помощью нотации ClassName.staticFunctionName из любого места в вашем приложении:

[some code...]

MyCustomLogger.log("My log text.")

[some more code...]

Такой подход довольно распространен. Оттуда это может стать более сложным, в зависимости от ваших потребностей; ваше сообщение указывает, что вы хотите записать строку в объект TextField, и в этом случае статическая функция журнала потребует либо ссылку на этот объект TextField при его вызове, либо собственный статический путь доступа к экземпляру TextField, как определено в другом месте вашего приложения. , В этом случае я мог бы предложить определить глобальную переменную экземпляра, в конструктор которой вы могли бы передать ссылку на цель TextField (и записать в нее с помощью своей функции журнала), или различные другие подходы - снова, в зависимости от ваших конкретных потребностей. Но в целях иллюстрации использование общедоступного статического метода является одним из достаточно стандартных подходов, которые вы могли бы рассмотреть.

2 голосов
/ 25 июня 2009

Другой подход заключается в использовании класса Singleton. Короче говоря, это очень похоже на класс, который вам показал Кристиан, но способ доступа к нему - SingletonClass.getInstance (). DoSomething (). Принцип, лежащий в основе этого, заключается в том, что класс хранит только один экземпляр самого себя, поэтому каждый раз, когда вы вызываете getInstance (), класс проверяет, был ли создан этот экземпляр, и возвращает его. Вы можете узнать больше об этом и проверить различные реализации этого здесь: http://life.neophi.com/danielr/2006/10/singleton_pattern_in_as3.html

Для вашего случая, я бы, наверное, пошел более простым путем статического глобального класса, как сказал Кристиан. Чтобы получить доступ к текстовому полю из статического метода log (), вы можете создать другой статический метод registerTextfield (tf: TextField) и вызвать его в начале приложения с помощью текстового поля, зарегистрировать его в статической переменной и перейти из там. Если добавить пример Кристиана, это будет выглядеть примерно так:

package
{
    import flash.text.TextField;
    public class MyCustomLogger
    {
        private static var _textfield:TextField;

        public function MyCustomLogger()
        {
                //
        }

        public static function log(text:String):void
        {
                _textfield.text=text;
        }

        public static function registerTextField(textfield:TextField):void
        {
                _textfield=textfield;
        }
    }
}

Удачи!

0 голосов
/ 25 июня 2009

Объектно-ориентированный способ сделать это - создать частичный (абстрактный, отложенный) класс, содержащий ваши функции ведения журнала, и наследовать от этого класса, если вам нужно использовать эти средства.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...