Просмотр полной версии : наследование
Возникла проблема: существует два класса А и В. Нужно, чтобы класс В расширял А. И мне надо в классе А создать экземпляр класса В, который будет, в зависимости от ситуации, вызывать функции в классе А. Но я не могу этого сделать, так как в классе А класс В не создается из-за получающейся бесконечности. Думал создать класс С, в класс А запихать функции, которые нужны классу В, и затем из класса С вызывать методы из класса А, который в свою очередь связан с В. Но это по определенным причинам не совсем подходит.
iflamberg
16.01.2013, 19:15
Для таких задач существуют интерфейсы.
Возникла проблема: существует два класса А и В. Нужно, чтобы класс В расширял А. И мне надо в классе А создать экземпляр класса В, который будет, в зависимости от ситуации, вызывать функции в классе А.
У вас каша в голове, почитайте К. Мука и про ООП.
caseyryan
16.01.2013, 20:39
Для таких задач существуют интерфейсы.
Для таких? О_о
iflamberg
16.01.2013, 20:43
Для таких? О_о
Ну, понятное дело, что с точки зрения ООП - это дурдом. Класс-наследник класса, и в родителе ссылка на объект наследника. Но возможно ТС и не хотел использовать наследование. Возможно во всех этих классах он просто хотел реализовать один и тот же интерфейс, тогда все выглядит более-менее правдоподобным.
Объяснил я видимо коряво) Есть класс Connection, который разными методами по разному отправляет запросы на сервер. Существует класс Skill, метод которого вызывается в Connection, делает определенные действия и вызывает метод в Connection(метод этот отправляет запрос на сервер, принимает данные и обновляет интерфейс).
Ну не дурдом, вполне штатная ситуация: DisplayObject - родительский класс по отношению к DisplayObjectContainer, но у него есть свойство типа DisplayObjectContainer (parent).
AS3 такое тоже позволяет, т.е. заявлять о зависимостки к наследникам. Хорошо это или нет? - я не знаю, это может усложнить ситуацию, но в целом, я не вижу ничего плохого в этом.
Но я так понял, что проблема скорее в том что:
class A {
public function A() { new B(); }
}
class B extends A {
public function B() { super(); }
}
Я специально подчеркнул super(), чтобы нагляднее выло видно где происходит рекурсивный вызов, без условия.
Соответственно, варианты решения:
- вообще убрать создание чего бы то ни было из конструктора (это по ряду причин редко когда чем-то хорошим заканчивается), перенесите содержание конструктора в другую функцию. Если хочется полсе этого можно еще добавить статический метод, который обернет конструктор и функцию-иницализатор, например, так:
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;
}
}
Если, по каким-то причинам, решение не устраивает, можно отталкиваться от, например, параметров к конструктору, или через отражение выяснить в каком именно классе выполняется код, и отреагировать соответственно. Например:
class A {
public function A() {
if (this.constructor == A) new B();
}
}
Но для каких-то других случаев можно придумать другие решения. Например, лениво создавать B, т.е. только тогда, когда он понадобиться, и таким образом можно реализовать условно бесконечную цепочку. Например:
class A {
private var _b:B;
public function get b():B {
if (!_b) this._b = new B();
return this._b;
}
public function A() {}
}
if (this.constructor == A) new B();
wvxvw, оно понятно, что человеку хочется наследования, но как он с этим будет дальше писать своё приложение?
На худой конец вместо такого ифа можно полиморфный фабричный метод newInstance() сделать и вызывать в конструкторе, но так то зачем?
Объяснил я видимо коряво) Есть класс Connection, который разными методами по разному отправляет запросы на сервер. Существует класс Skill, метод которого вызывается в Connection, делает определенные действия и вызывает метод в Connection(метод этот отправляет запрос на сервер, принимает данные и обновляет интерфейс).
Ну и вызовите метод у Skill внутри Connection, а потом из Skill вызовите метод Connection.
Передать Connection в Skill можно при вызове его метода или при передаче Skill в Connection (я не знаю как там у вас всё организовано)
Какое наследование? Зачем наследование?
wvxvw, спасибо! Окончательно разобрался в своей галиматье, буду переделывать архитектуру немного.
expl, Мало ли зачем это (кому-то) нужно. Я лучше не буду за ОПа додумывать. Можно так сделать? - да. Есть какие-то ситуации, когда это может быть легитимным подходом? - да, пожалуй. Это не единственный вариант, который я предложил.
Я рассчитваю на то, что люди сознательные, посмотрят на разные варианты и выберут, что подходит.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.