Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работа с несколькими классами (http://www.flasher.ru/forum/showthread.php?t=167191)

cervikx 08.09.2011 19:53

Работа с несколькими классами
 
Добрый вечер. Я умею работать с 1 классом as 3.0.
Сейчас мне стало не удобно работать с 1 классом т.к. получился большой объём кода.
Дак вот собственно вопрос:

Допустим я создал 2 класса. 1 основной - Main и дополнительный - Data.
Как добавить класс Data в приложение?
Как передать в этот класс переменную variable в класс Data из Main?
Как вызвать функцию Data класса Data из класса Main?

dimarik 08.09.2011 21:49

в Main

Код AS3:

/* Как добавить класс Data в приложение? */
var data:Data = new Data();
 
/* Как передать в этот класс переменную variable в класс Data из Main? */
var variable:String = "Значение переменной";
data.variable = variable;
 
trace(data.variable);// output "Значение переменной"
 
/* Как вызвать функцию Data класса Data из класса Main? */
data.doSomething();

Код AS3:

class Data {
 
    public var variable:    String;
 
    public function doSomething():void {
        trace("Вызван метод doSomething");
    }
 
}


Zebestov 08.09.2011 21:54

Два файла.

Первый: Main.as

Код AS3:

package
{
    public class Main extends Sprite
    {
 
        private var dataObject:Data;
 
        public function Main()
        {
            var anyVar:* = "Any value";
            this.dataObject = new Data(anyVar);
            this.dataObject.data();
        }
    }
}

Второй: Data.as

Код AS3:

package
{
    public class Data
    {
 
        private var incomingVar:*;
 
        public function Data(arg:*)
        {
            this.incomingVar = arg;
        }
 
        public function data():void
        {
            // do something
        }
    }
}

Добавлено через 1 минуту
То никого, то все сразу :)

dimarik 08.09.2011 22:04

this! [x]

wolhw 08.09.2011 22:58

Код AS3:

package
{
public class Data extends Main
{
}
}

работаем с дата как с мейн

Zebestov 08.09.2011 23:03

wolhw, ну вот не боишься, что сейчас достанем линейки надаём по рукам а?:quiet:

cervikx 08.09.2011 23:05

А ты можешь пожалуйста расписать подробнее про передачу переменных в другой класс.
Допустим в классе Main создаётся кнопка при нажатии на которую переменной variable добавляется 1.
Класс data получает эту переменную и увеличивает значение ещё на 1 и выводит её в textField.
Притом значение переменной variable нужно чтобы изменилось и в классе Main.
Как в таком случае осуществлять передачу этой переменной?
Хотелось чтобы можно было использовать эту переменную без передачи туда - сюда...

dimarik 08.09.2011 23:11

Запятые очень обижаются, когда их игнорируют. Вот вам немного запятых:,,,,,,. Расставьте в своем посте.

wolhw 08.09.2011 23:14

Zebestov
Цитата:

Сообщение от cervikx (Сообщение 1029482)
Сейчас мне стало не удобно работать с 1 классом т.к. получился большой объём кода.

ну если всего 1 класс в приложении можно и разбить на 2а сделать все методы и вары протектед и ничего никуда передавать ненужно)

Добавлено через 10 минут
cervikx
Код AS3:

package
{
 
public class Main
 
protected var r1:String="allo"; //переменная в класе Мейн
 
public function Main()
{
}
protected function traser():void
{ trace(r1); }
{
}
}

Код AS3:

package
{
 
public class data extends Main //тут важно!
{
public function data()
{
trace(r1);//получим -- allo
r1="privet";
tracer();// --- privet
}
}
}


Dukobpa3 09.09.2011 00:16

Просит таки линейки, да. Еще раз такой совет и начнем скидываться.

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

wolhw 09.09.2011 00:28

А почему моветон, и чем плохо такое расшивение?
Я просто тоже учусь пока и сам пользуюсь такой конструкцией (не не мейн расширяю конечно, а другие слишком разросшиеся классы, Model например с конструкции AMVC)
вот например у меня в ModelQ.as подгружаются даные c mySQL, в ModelCore.as -- все расчеты итд. а в мейн класе юзаю ModelMain() (последнее звено расшырения, если можно так сказать).
Чем мне ето грозит?

in4core 09.09.2011 01:18

Цитата:

Чем мне ето грозит?
Венерическими заболеваниями )))

Tasmanec 09.09.2011 01:44

Класс Main():

Код AS3:

/**
 * Created by IntelliJ IDEA.
 * User: Tasmanec
  */

package {
import flash.display.*;
import flash.events.MouseEvent;
import fl.controls.Button;
import flash.text.TextField;
 
public class Main extends Sprite
{
  public  var myButton:Button = new Button();
  public static var variable:Number = 0;
  public static var text:TextField = new TextField();
 
    public function Main() {
        addChild(myButton);
        myButton.addEventListener(MouseEvent.CLICK, increment);
        text.border = true;
        text.y = 50;
 
        addChild(text);
    }
    private function increment(e:MouseEvent):void
    {
      variable++;
      new Data().addOne();
    }
}
}


Класс Data():

Код AS3:

/**
 * Created by IntelliJ IDEA.
 * User: Tasmanec
 */

package {
 
public class Data {
    public function Data()
    {
 
    }
    public function addOne():void
    {
      Main.variable++;
      Main.text.text = String (Main.variable);
 
    }
}
}


Dukobpa3 09.09.2011 01:46

Еще один. С ума блин посходили????
Код AS3:

      Main.variable++;
      Main.text.text = String (Main.variable);

Добавлено через 55 секунд
Код AS3:

    private function increment(e:MouseEvent):void
    {
      variable++;
      new Data().addOne();
    }

Добавлено через 3 минуты
какой смысл выносить инкремент переменной в какой-то отдельный класс? просто чтоб принципиально добавить лишний класс?

Такие элементарные действия как раз в одном классе должны происходить. А отдельные классы должны выдела=яться под какой-то отдельный логическо функциональный блок.

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

Вот и разделяем наш один класс на три куска.:
Земля
враг
главный герой.

А вот это вот типа "инкремент своей переменной через жопу" - это будем врагам советовать.

Tasmanec 09.09.2011 01:56

Цитата:

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

Вот и разделяем наш один класс на три куска.:
Земля
враг
главный герой.
так и делаю, собственно всегда)


Цитата:

Сообщение от cervikx (Сообщение 1029548)
А ты можешь пожалуйста расписать подробнее про передачу переменных в другой класс.
Допустим в классе Main создаётся кнопка при нажатии на которую переменной variable добавляется 1.
Класс data получает эту переменную и увеличивает значение ещё на 1 и выводит её в textField.
Притом значение переменной variable нужно чтобы изменилось и в классе Main.
Как в таком случае осуществлять передачу этой переменной?
Хотелось чтобы можно было использовать эту переменную без передачи туда - сюда...

как спрашивали, так и написал)

incvizitor 09.09.2011 02:23

Tasmanec, вообще почитать о том как переместить переменную в другой класс можете сдесь.

Задайте себе как минимум следушие вопросы:
1 - зачем в increment инкрементить переменную, а потом вызывать метод который опять же её инкрементит?
2 - зачем каждый раз, при вызове increment, создавать экземпляр класса Data?

Остальное, не знаю получится ли объясним Вам на данном этапе.

Tasmanec 09.09.2011 02:44

мегаступил, бывает
беру свои слова обратно, вместе с кодом))

cervikx 09.09.2011 08:29

Мне несколько классов нужны для создания одной тд игры.
А просто как кто-то писал наследоваться от класса Main нельзя?

Dukobpa3 09.09.2011 08:30

Вы мне объясните мотивацию наследования от мейн? ЗАЧЕМ??? это может понадобиться сделать?

Добавлено через 1 минуту
Задача мейна инициализировать всех и вся, раздать каждому роли и уйти в сторонку. А всё остальное наполнение потом живет своей жизнью.

По крайней мере у меня так обычно. Такая привычка еще с плюсов осталась.

djyamato 09.09.2011 10:34

Вложений: 1
чуть не в тему но все же
Мой рабочий стол

dimarik 09.09.2011 11:06

Хорошая у вас компания. Даже Софинк купили.

djyamato 09.09.2011 11:38

Цитата:

Сообщение от wolhw (Сообщение 1029568)
А почему моветон,

Простите за глупый вопрос, ачто такое моветон ?

Цитата:

Сообщение от dimarik (Сообщение 1029568)
Хорошая у вас компания. Даже Софинк купили.

trial, и адоб триаловские, вот так и живем

gloomyBrain 09.09.2011 11:46

Время пришло: моветон

dimarik 09.09.2011 15:16

Цитата:

Сообщение от djyamato (Сообщение 1029678)
trial, и адоб триаловские, вот так и живем

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

cervikx 09.09.2011 17:13

Что то до меня координально не доходит как сделать правильно... Вроде мука прочитал. Основы понял а вот с несколькими классами ппц...
Объясните мне пожалуйста как всётаки нужно делать.
Доп классы нужны мне для создания и обработки множества однотипных объектов: враги, пули и тд

Dukobpa3 09.09.2011 17:23

Цитата:

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

incvizitor 09.09.2011 17:41

cervikx,

Рассмотрим на примере приложения создающего объекты на сцене по клику мышки:
Код AS3:

package {
  /**
      основной класс приложения
  */

  public class Main extends Sprite{
        addEventListener(MouseEvent.CLICK, _onMouseClick);
  }
 
  private function _onMouseClick():void{
        var myEnemy:Enemy = new Enemy();
        myEnemy.x = e.mouseX;
        myEnemy.y = e.mouseY;
        addChild(myEnemy);
  }
}

Код AS3:

 
package {
  /**
      Класс объекта который мы будем класть на сцену
  */

  public class Enemy extends Sprite{
        function Enemy(){
            graphics.beginField(0);
            graphics.drawRect(-10,-10,20,20);       
        }
  }
}

Класс Main создает и использует экземпляры класса Enemy. Класс Main знает о классе Enemy, в то время как класс Enemy о Main не знает ничего, что позволяет, например, использовать его в других проектах.

wolhw 09.09.2011 18:02

Цитата:

Сообщение от djyamato (Сообщение 1029678)
Простите за глупый вопрос, ачто такое моветон ?

Ето вы у
Цитата:

Сообщение от Dukobpa3 (Сообщение 1029563)
Мейн он всего один, от него наследоваться это моветон и нефиг тут продвигать заведомо неправильную архитектуру, это будут люди читать, а некоторые даже делать то что увидели.

спросите)

Добавлено через 16 минут
Цитата:

Сообщение от cervikx (Сообщение 1029809)
Что то до меня координально не доходит как сделать правильно... Вроде мука прочитал. Основы понял а вот с несколькими классами ппц...
Объясните мне пожалуйста как всётаки нужно делать.
Доп классы нужны мне для создания и обработки множества однотипных объектов: враги, пули и тд

Ну чтоб ненаследоватся от мейн можно сделать так
Код AS3:

public class Main()
{
var App:Application;
 
public function Main();
{
App=new Application(); // 
}
}

Код AS3:

public class Class1 extends Sprite//первый класс
{
}
.....
public class Class2 extends Class1//второй
{
}
.....
 
public class Application extends Class2//последний
{
}

от мейн не наследуем, если стоит вопрос
Цитата:

Сообщение от cervikx (Сообщение 1029482)
Сейчас мне стало не удобно работать с 1 классом т.к. получился большой объём кода.

как по мне самое то

КорДум 09.09.2011 18:29

Ужас какой. Эдакое разрозненное процедурное программирование. И нафиг это ООП.

cervikx 09.09.2011 18:34

спасибо. Понял немного...

wolhw 09.09.2011 19:14

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

Vishapakahr 10.09.2011 00:01

У меня есть вопрос но не уверен что это не оффтоп :)

Как можно получить статичные методы и переменны в наследованном классе ? Пока я их просто перезаписываю но очевидно это не правильно !

Psycho Tiger 10.09.2011 01:39

Никак. Статика не наследуется. Да и зачем?
Это нужно в очень редких специфических случаев. Ради этого можно сделать синглтон: статикой сделать экземпляр класса, и его уже наследовать как угодно.

Zebestov 10.09.2011 02:13

http://7centoff.ru/wp-content/upload...nsport0002.jpg

и короче один из этих пассажиров говорит:
Цитата:

да фих его знает ужас не ужас, все говорят ужас а почему ужас так никто и не дал ответа
wolhw, предложенный тобой метод — это всего лишь нелепая попытка разделить один рулон обоев на куски. Это не имеет никакого отношения к хорошо организованному проекту, в котором разделение кода на части вовсе не является единственным преимуществом.

Vishapakahr 10.09.2011 02:17

Цитата:

Сообщение от Psycho Tiger (Сообщение 1029929)
Никак. Статика не наследуется. Да и зачем?
Это нужно в очень редких специфических случаев. Ради этого можно сделать синглтон: статикой сделать экземпляр класса, и его уже наследовать как угодно.

Да , в основном чисто теоритически интересно :) при использовании pureMVC при наследовании Facade , Mediator ... некоторие статичные методы переписываю.

incvizitor 10.09.2011 02:22

Vishapakah,

Код AS3:

class A{
 
    public static var a:String = "Class A, property a";
 
}
 
class B extends A{
    public function B(){
        trace(A.a);//Class A, property a
    }
}


Vishapakahr 10.09.2011 02:33

Цитата:

Сообщение от incvizitor (Сообщение 1029954)
Vishapakah,

Код AS3:

class A{
 
    public static var a:String = "Class A, property a";
 
}
 
class B extends A{
    public function B(){
        trace(A.a);//Class A, property a
    }
}


Да нет не об этом речь , в дальнейшем используется класс B , вот как лехко получить B.a не переписая тоже что и при классе A ? особенно интересно методы .

alatar 10.09.2011 03:04

Никак, вам уже сказали. Статичные константы являются членами класса, а не экземпляра и не наследуются. Наследуется только область видимости. Т.е. внутри класса B вы можете обращаться к константе (или статичному методу) по имени. В таких случаях, обычно, константы выделяются в отдельный класс. В API плеера это сплошь и рядом.

Vishapakahr 10.09.2011 03:15

Цитата:

Сообщение от Psycho Tiger (Сообщение 1029929)
Никак. Статика не наследуется. Да и зачем?
Это нужно в очень редких специфических случаев. Ради этого можно сделать синглтон: статикой сделать экземпляр класса, и его уже наследовать как угодно.

Вот про этой красно выделенной части подробнее можно ?

Добавлено через 4 минуты
Ах да вспомнил , давно хотел спросить просто часто забывал , а как можно имея толька класс B получить родительский класс (на данном примере это A)?

alatar 10.09.2011 03:26

Что значит получить? Вызвать метод A из B?
Код AS3:

super.someMethod();
super.someProperty = 42;



Часовой пояс GMT +4, время: 10:08.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.