Как обратиться к вышестоящему классу?

xintrea

Новичок
Как обратиться к вышестоящему классу?

Здравствуйте!


Есть два класса - "Поле" и "Набор полей". В классе "Набор полей" есть массив (свойство), в котором лежат несколько объектов "Поле". Примерно так:

Код:
class field
{
 private $name='';
 private $value='';

 function set_name($name){$this->name=$name;}

 function set_value($value){$this->value=$value;}
}

...

#include field.php

class field_collection
{
 $fields=array();

 function add_field($name, $value)
 {
  $field=new field();
  $field->set_name($name);
  $field->set_value($value);

  $this->fields=$this->fields+$field;
 }

 function get_math_fields_list()
 {
  ...
 }

}
И нужно мне иметь возможность вызвать из объекта класса field метод get_math_fields_list() вышестоящего объекта field_collection. Вопрос - как это сделать?

Мне на ум приходит только создание в классе field дополнительного свойства, типа $referece_to_field_collection. И дописывать код, чтобы каждому объекту field в конструкторе передавалась ссылка на "вышестоящий" класс. Но как-то все это извратно, можно ли сделать по-другому, просто вызвать метод в классе, стоящим "вверху" по компоновке?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Значит, у тебя инкапсуляция нарушена, раз тебе нужно обработать данные обьекта чужим кодом. То бишь, ошибка в проектировании.
 

tz-lom

Продвинутый новичок
помоему у вас проблемы с архитектурой,если вам такое надо

однако раз вы не используете наследования,то единственный способ указать "верх компоновки" - переменная
но это некрасиво => проблемы с архитектурой
 

xintrea

Новичок
Автор оригинала: флоппик
Значит, у тебя инкапсуляция нарушена, раз тебе нужно обработать данные обьекта чужим кодом. То бишь, ошибка в проектировании.
Ну а как ты предлагаешь спроектировать вычисляемые поля?

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

Я вижу, что объект "Поле" должен посылать "сигнал" о том, что его значение изменилось, объекту "Набор полей", чтобы тот отправил "сигнал" пересчитать значения всем полям. И все поля должны иметь возможность получить значения других полей, чтобы, если поле вычислимое, высчиталось новое значение.
 

xintrea

Новичок
Автор оригинала: freeek
пусть "Набор полей" подпишется на изменение "Поле"
Это что-то из разряда паттернов проектирования? Я в них не разбираюсь, ибо тема сложная, но не с кем пообщаться о них в курилке на коленке.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Ну а как ты предлагаешь спроектировать вычисляемые поля?
Я не знаком с задачей, поэтому и сказать как ее спроектировать, естественно, не могу.
А "сигналы" посылаются если у тебя event driven приложение.
Но я могу предположить, что обьекты в коллекции не должны самостоятельно менять состояние, а должны его менять через родительский обьект (что логично, иначе нет смысла обьединять их в коллекцию), после чего родительский обьект должен вызвать пересчет зависимых полей. в псевдокоде как то так:
PHP:
<?php
class collection {
    private $fields = array();
    public function modify($field_id, $value) {
         $this->field[$field_id] = $value;
         $this->recompute_fields();
    }
}
....
$collection->modify('FieldID', 'Value');
....
?>
 

FB3

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