Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.01.2013, 19:00
loigor3 вне форума Посмотреть профиль Отправить личное сообщение для loigor3 Найти все сообщения от loigor3
  № 1  
Ответить с цитированием
loigor3

Регистрация: Apr 2011
Сообщений: 20
По умолчанию наследование

Возникла проблема: существует два класса А и В. Нужно, чтобы класс В расширял А. И мне надо в классе А создать экземпляр класса В, который будет, в зависимости от ситуации, вызывать функции в классе А. Но я не могу этого сделать, так как в классе А класс В не создается из-за получающейся бесконечности. Думал создать класс С, в класс А запихать функции, которые нужны классу В, и затем из класса С вызывать методы из класса А, который в свою очередь связан с В. Но это по определенным причинам не совсем подходит.

Старый 16.01.2013, 19:15
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 2  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Для таких задач существуют интерфейсы.
__________________
мой пустой блог

Старый 16.01.2013, 20:26
spirit2 вне форума Посмотреть профиль Отправить личное сообщение для spirit2 Найти все сообщения от spirit2
  № 3  
Ответить с цитированием
spirit2

Регистрация: Dec 2009
Сообщений: 125
Цитата:
Сообщение от loigor3 Посмотреть сообщение
Возникла проблема: существует два класса А и В. Нужно, чтобы класс В расширял А. И мне надо в классе А создать экземпляр класса В, который будет, в зависимости от ситуации, вызывать функции в классе А.
У вас каша в голове, почитайте К. Мука и про ООП.

Старый 16.01.2013, 20:39
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Для таких задач существуют интерфейсы.
Для таких? О_о

Старый 16.01.2013, 20:43
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 5  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Цитата:
Для таких? О_о
Ну, понятное дело, что с точки зрения ООП - это дурдом. Класс-наследник класса, и в родителе ссылка на объект наследника. Но возможно ТС и не хотел использовать наследование. Возможно во всех этих классах он просто хотел реализовать один и тот же интерфейс, тогда все выглядит более-менее правдоподобным.
__________________
мой пустой блог

Старый 16.01.2013, 21:04
loigor3 вне форума Посмотреть профиль Отправить личное сообщение для loigor3 Найти все сообщения от loigor3
  № 6  
Ответить с цитированием
loigor3

Регистрация: Apr 2011
Сообщений: 20
Объяснил я видимо коряво) Есть класс Connection, который разными методами по разному отправляет запросы на сервер. Существует класс Skill, метод которого вызывается в Connection, делает определенные действия и вызывает метод в Connection(метод этот отправляет запрос на сервер, принимает данные и обновляет интерфейс).

Старый 16.01.2013, 21:08
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну не дурдом, вполне штатная ситуация: DisplayObject - родительский класс по отношению к DisplayObjectContainer, но у него есть свойство типа DisplayObjectContainer (parent).
AS3 такое тоже позволяет, т.е. заявлять о зависимостки к наследникам. Хорошо это или нет? - я не знаю, это может усложнить ситуацию, но в целом, я не вижу ничего плохого в этом.

Но я так понял, что проблема скорее в том что:

Код AS3:
class A {
    public function A() { new B(); }
}
class B extends A {
    public function B() { super(); }
}
Я специально подчеркнул super(), чтобы нагляднее выло видно где происходит рекурсивный вызов, без условия.
Соответственно, варианты решения:
- вообще убрать создание чего бы то ни было из конструктора (это по ряду причин редко когда чем-то хорошим заканчивается), перенесите содержание конструктора в другую функцию. Если хочется полсе этого можно еще добавить статический метод, который обернет конструктор и функцию-иницализатор, например, так:

Код AS3:
calss A {
    public function A() {}
    public function initialize():void { new B(); }
    public static function makeA():A {
        var a:A = new A();
        a.initialize();
        return a;
    }
}
Если, по каким-то причинам, решение не устраивает, можно отталкиваться от, например, параметров к конструктору, или через отражение выяснить в каком именно классе выполняется код, и отреагировать соответственно. Например:

Код AS3:
class A {
    public function A() {
        if (this.constructor == A) new B();
    }
}
Но для каких-то других случаев можно придумать другие решения. Например, лениво создавать B, т.е. только тогда, когда он понадобиться, и таким образом можно реализовать условно бесконечную цепочку. Например:

Код AS3:
class A {
    private var _b:B;
    public function get b():B {
        if (!_b) this._b = new B();
        return this._b;
    }
    public function A() {}
}
__________________
Hell is the possibility of sanity

Старый 16.01.2013, 21:22
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Код AS3:
if (this.constructor == A) new B();
wvxvw, оно понятно, что человеку хочется наследования, но как он с этим будет дальше писать своё приложение?
На худой конец вместо такого ифа можно полиморфный фабричный метод newInstance() сделать и вызывать в конструкторе, но так то зачем?

Цитата:
Объяснил я видимо коряво) Есть класс Connection, который разными методами по разному отправляет запросы на сервер. Существует класс Skill, метод которого вызывается в Connection, делает определенные действия и вызывает метод в Connection(метод этот отправляет запрос на сервер, принимает данные и обновляет интерфейс).
Ну и вызовите метод у Skill внутри Connection, а потом из Skill вызовите метод Connection.
Передать Connection в Skill можно при вызове его метода или при передаче Skill в Connection (я не знаю как там у вас всё организовано)
Какое наследование? Зачем наследование?

Старый 16.01.2013, 21:41
loigor3 вне форума Посмотреть профиль Отправить личное сообщение для loigor3 Найти все сообщения от loigor3
  № 9  
Ответить с цитированием
loigor3

Регистрация: Apr 2011
Сообщений: 20
wvxvw, спасибо! Окончательно разобрался в своей галиматье, буду переделывать архитектуру немного.

Старый 17.01.2013, 04:09
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
expl, Мало ли зачем это (кому-то) нужно. Я лучше не буду за ОПа додумывать. Можно так сделать? - да. Есть какие-то ситуации, когда это может быть легитимным подходом? - да, пожалуй. Это не единственный вариант, который я предложил.
Я рассчитваю на то, что люди сознательные, посмотрят на разные варианты и выберут, что подходит.
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:27.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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