PDA

Просмотр полной версии : Работа с несколькими классами


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

/* Как добавить класс Data в приложение? */
var data:Data = new Data();

/* Как передать в этот класс переменную variable в класс Data из Main? */
var variable:String = "Значение переменной";
data.variable = variable;

trace(data.variable);// output "Значение переменной"

/* Как вызвать функцию Data класса Data из класса Main? */
data.doSomething();

class Data {

public var variable: String;

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

}

Zebestov
08.09.2011, 21:54
Два файла.

Первый: Main.as


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


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

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

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

Добавлено через 10 минут
cervikx
package
{

public class Main

protected var r1:String="allo"; //переменная в класе Мейн

public function Main()
{
}
protected function traser():void
{ trace(r1); }
{
}
}


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():


/**
* 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():


/**
* 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
Еще один. С ума блин посходили????

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

Добавлено через 55 секунд
private function increment(e:MouseEvent):void
{
variable++;
new Data().addOne();
}

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

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

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

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

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

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

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

так и делаю, собственно всегда)


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

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

incvizitor
09.09.2011, 02:23
Tasmanec, вообще почитать о том как переместить переменную в другой класс можете сдесь (http://www.refactoring.com/catalog/moveField.html).

Задайте себе как минимум следушие вопросы:
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
чуть не в тему но все же
Мой рабочий стол

dimarik
09.09.2011, 11:06
Хорошая у вас компания. Даже Софинк купили.

djyamato
09.09.2011, 11:38
А почему моветон,

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

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

gloomyBrain
09.09.2011, 11:46
Время пришло: моветон (http://lmgtfy.com/?q=%D0%BC%D0%BE%D0%B2%D0%B5%D1%82%D0%BE%D0%BD)

dimarik
09.09.2011, 15:16
trial, и адоб триаловские, вот так и живем

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

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

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

incvizitor
09.09.2011, 17:41
cervikx,

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

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);
}
}




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
Простите за глупый вопрос, ачто такое моветон ?

Ето вы у

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

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

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

public class Main()
{
var App:Application;

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



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

public class Application extends Class2//последний
{
}

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

Сейчас мне стало не удобно работать с 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/uploads/2011/07/transport0002.jpg

и короче один из этих пассажиров говорит:
да фих его знает ужас не ужас, все говорят ужас а почему ужас так никто и не дал ответа

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

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

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

incvizitor
10.09.2011, 02:22
Vishapakah,


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
Vishapakah,


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

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

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

alatar
10.09.2011, 03:26
Что значит получить? Вызвать метод A из B?
super.someMethod();
super.someProperty = 42;

Vishapakahr
10.09.2011, 04:02
Что значит получить? Вызвать метод A из B?
super.someMethod();
super.someProperty = 42;

нет , не в классе B , совсем другом классе где известно толька B , и нужно узнать класс , от которого он был наследован.

alatar
10.09.2011, 04:29
describeType() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/utils/package.html#describeType()). Но вы занимаетесь ерундой.

Vishapakahr
10.09.2011, 13:42
describeType() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/utils/package.html#describeType()). Но вы занимаетесь ерундой.

Ммм.. да , возможно вы правы.

Psycho Tiger
11.09.2011, 21:52
Вот про этой красно выделенной части подробнее можно ?
B extends A
...
public staitc const b:B=new B();
...
b.methodFromA();
Но вообще, для статики можно сэмитировать наследование. Т.к. мы работаем не с экземпляром, то можно просто вызвать где-то внутри B статичный метод из A - и будет похоже на наследование )

GrafMine
12.09.2011, 02:03
Все примеры указанные тут говорят только как из Main изменить что-то в другом классе.
A как например с Second.as поменять или добавить значение, которое объявлено в Main.as ?

alatar
12.09.2011, 02:34
Это противоречит принципам ООП.

andrew911
12.09.2011, 02:37
Продиспатчить событие в Second, поймать и обработать в Main.

GrafMine
12.09.2011, 02:55
Продиспатчить событие в Second, поймать и обработать в Main.
Да но диспатч не всегда спасает, еще можно через root но говорят так делать плохо.
Есть еще какие-то другие варианты? :\

andrew911
12.09.2011, 03:05
А когда он не спасает?
Правильный такой, уведомляете родителя, дальше он сам решает.

GrafMine
12.09.2011, 03:13
А когда он не спасает?
Правильный такой, уведомляете родителя, дальше он сам решает.

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

alatar
12.09.2011, 03:16
А для этого уже отдельные примеры нужно писать?