LINUX.ORG.RU

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


0

0

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

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

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 в конструкторе передавалась ссылка на «вышестоящий» класс. Но как-то все это извратно, можно ли сделать по-другому, просто вызвать метод в классе, стоящим «вверху» по компоновке?


Изврат.

Приделайте интерфейсный метод к классу field и прогоните итерацию по $fields из field_collection

Или если уж так надо передавать экземпляру field массив $math_fields_list из объекта field_collection, это проще сделать аргументом метода класса field

Или я курю не тот хэш :D

Bad_Habit
()
Ответ на: комментарий от Bad_Habit

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

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

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

xintrea
() автор топика

о_О а ты в курсе что #include с точки зрения синтаксиса пыха это комментарий? пиши просто include, а лучше require

annulen ★★★★★
()
Ответ на: комментарий от annulen

В курсе, это я по запарке.

Интересно наблюдать за советчиками, которые тыкают в клчевое слово parent::, хотя наследованием тут и не пахло.

xintrea
() автор топика
Ответ на: комментарий от xintrea

> можно ли сделать по-другому, просто вызвать метод в классе, стоящим «вверху» по компоновке?

Интересно наблюдать за советчиками, которые тыкают в клчевое слово parent::, хотя наследованием тут и не пахло.

я ничего не понял :(

Bad_Habit
()

бред какой-то, сделать static function get_math_fields_list(), как из одного объекта вызвать метод другого объекта, полиморфизм токо если

Aid_
()
Ответ на: комментарий от xintrea

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

А я вижу, что объект «поле» должен посылать сигнал всем своим подписчикам, которые тоже суть объекты «поле». А дальше высчитывай новое значение. Смотри паттерн обсервер по линку выше. И нафиг не нужен «набор полей» (если конечно пересылка уведомлений - единственная его функциональность).

Любители усложнять себе жизнь такие любители.

anonymous
()
Ответ на: комментарий от xintrea
interface IChangeListener {
    public function fieldChanged($field);
}
class Field {
    var $changeListener;
    public function __construct() { $this->changeListener = null; }
    public function setListener($listener) { this->changeListener = $listener; }
    public function setValue($v) {
        ...;
        if ($this->changeListener!=null) {
            $this->changeListener->fieldChanged($this);
        }
    }
}
class FieldSet implements IChangeListener {
    var $fields;
    public function __construct() { $this->fields=array(); }
    public function fieldChanged($field) {
         print "My field changed!!!";
    }
    public function addField($field) {
        array_push($this->fields,$field);
        $field->setListener($this);
    }
}

Всё, при любом изменении поля добавленного в FieldSet в соответствующем FieldSet будет вызвана функция fieldChanged, которой в качестве аргумента будет передано изменившееся поле.

no-dashi ★★★★★
()
Ответ на: комментарий от no-dashi

$changeListener в Field может быть и массивом или списком (setListener тогда надо заменить на addListener+removeListener), тогда можно будет регистрировать сколь угодно много подписчиков, которые все будут получать извещение что поле изменилось.

no-dashi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.