Просмотр полной версии : как взять ссылку на set-метод класса? (плюс др.вопросы по синтаксису)
chabapok
08.11.2009, 18:32
1) если есть:
public function set myVar(value){}
public function get myVar():int{}
...
function init(method:Function){}
как вызвать функцию init с параметром сеттера myVar?
2) как передать примитивное значение (int,String...) по ссылке?
1) Зачем?
2) Написать простенький контейнер для этих значений или использовать встроенный:
var cont:Object = {intParam:25, strParam:'строка'};
foo(cont);
trace(cont);
function foo(params:Object):void{
params.intParam = 777;
params.strParam = 'ururu';
}
2) как передать примитивное значение (int,String...) по ссылке?
Примитивные значения по ссылке не передаются.
chabapok
08.11.2009, 18:58
1 - то есть как это зачем? чтобы в функции init можно было менять те значения, контроллером которых она является.
Я, конечно, упростил задачу, выделив главное. Поэтому, неочевидно зачем оно нужно.
2 - сам так думал, но это не cработало, почему-то.
bicubic_bublic
08.11.2009, 19:10
Не думаю что понял задачу правильно, но почему бы не передавать в init название сеттера (setterName), а дальше обращатся как
object[setterName] = value
chabapok
08.11.2009, 19:28
почему бы не передавать в init название сеттера (setterName), а дальше обращатся как
как передать в init название сеттера?
пытаюсь передать просто как будто это функция - передается название геттера.
gloomyBrain
08.11.2009, 19:35
ну как бы у сеттера и геттера по определению одно название на двоих =)
А Вы что сделать-то хотите? может есть какой-то иной путь?
chabapok
08.11.2009, 19:54
Конечно я знаю, что у сеттера и геттера одно название на двоих.
Конечно есть иной путь, и я им уже пошел - переделал сеттер в функцию setMyValue, а как взять адрес простой (не set) функции - это любой знает.
Но хотелось бы все же разобраться.
Что я хочу сделать - рассказывать долго, я не хотел этого касаться. Нор раз спрашивают
У меня есть, допустим, форма -- 100 полей TextField. (flex не рекомендовать, разговариваем про flash). И есть несколько классов со статическими переменными, которые нужно забиндить каждую со своим полем TextField. Причем в некоторых случаях нужно простое копирование, а в некоторых, например, разложить в массив параметры, введенные через запятую в текстовое поле. А в некоторых - еще какая-то другая логика парсинга того, что вводится в TextField.
Выход - я пишу 1 класс, контроллер, а экземпляры контроллера связываю с конкретным экземпляром TextField и конкретным set-методом. Плюс контроллер этот контролирует еще подсказки, которые в TextField выводятся, на все эти события подписывается, вид курсора меняет при наведении и тд. Собственно, на каждое TextField писать свою функцию подсказок скучно, а 1 класс с этим всем легко справляется.
после того, как я переделал "function set myValue()" в "function setMyValue()" -- все заработало, но просто это уже дело принципа - можно ли взять ссылку на сеттер.
gloomyBrain
08.11.2009, 20:21
а расширить класс текстового поля и задать параметры при создании - не проще???
chabapok
08.11.2009, 21:45
Как мне видится сейчас - нет.
Ну, если у меня сейчас из одно TextField складывается в String, а из другого - в Arraу, то сейчас я имею просто два разных сет-метода (ну или теперь функции)
а пришлось бы два разных класса делать. плюс третий - с общими методами, в котором подсказки реализованы. И на каждый способ расклыдвания пришлось бы заводить свой класс. А потом я путаюсь в именах файлов, и по два часа думаю как же обозвать воо-он тот класс.
Но мы ушли в оффтопик. Тема паттернов перктирования интересна и мне малопонятна, но исходный вопрос был все-таки про синтаксис
bicubic_bublic
08.11.2009, 21:56
public class Controller {
private var obj:Object;
private var textField:TextField;
private var propName:String;
public function Controller(textField:TextField, obj:Object, propName:String) {
this.textField = textField;
this.obj = obj;
this.propName = propName;
update(true);
textField.addEventListener(Event.CHANGE, onTFChange);
}
private function onTFChange(e:Event) {
update();
}
public function update(back:Boolean = false) {
if (back) {
textField.text = obj[propName];
} else {
obj[propName] = textField.text;
}
}
}
для массива:
new Controller(tf1, arr, 2);
для объекта:
new Controller(tf1, obj, 'prop');
gloomyBrain
08.11.2009, 22:03
Начните с этого:
public class TFWithPromt extends TextField{
public var prompt:String;
public function TFWithPromt (promptText:String){
super();
this.prompt = promptText;
this.addEventListener(MouseEvent.ROLL_OVER, showPrompt);
}
private function showPrompt(evt:Event){
// показываем подсказку
}
}
Потом как-то вот так:
public class MyTF extends TFWithPromt {
public static const DEFAULT_TEXT_1:String="поле 1";
public static const DEFAULT_TEXT_2:String="поле 2";
public static const DEFAULT_TEXT_3:String="поле 3";
public function MyTF (type:Number = 0){
super();
switch(type):
case 0:
this.text = DEFAULT_TEXT_1;
break;
}
}
Ну и далее вешаем в конструкции switch любой листенер на любое действи и определяем каков будет вывод данных с MyTF в зависимости от type
chabapok
09.11.2009, 00:33
gloomyBrain: Я понимаю что так можно, но вам не кажется ли, что несколько процедурно-ориентированно? (вопрос риторический) Где-то в дебрях свей библии Страуструпп критиковал такой метод.
2bicubic_bublic: ну я и сделал так, примерно.
* * *
Но все же хотелось не уклоняться от темы. Вариантов решения можно наплодить много, я это понимаю.
вопрос топика был: возможно ли передать ссылку на сеттер?
Уже совершенно не важно каким другим путем можно пойти. Вопрос ПРИНЦИПИАЛЬНЫЙ, ради интереса, и чтобы знать в будущем.
bicubic_bublic
09.11.2009, 02:01
Уже совершенно не важно каким другим путем можно пойти. Вопрос ПРИНЦИПИАЛЬНЫЙ, ради интереса, и чтобы знать в будущем.
ну что в гугле нашлось http://stackoverflow.com/questions/1478923/referencing-getter-setter-functions-in-actionscript-3
и, видимо, это действительно так: нельзя получить ссылку на функцию сеттер-геттер
switcher!
09.11.2009, 12:09
package
{
import flash.display.Sprite;
public class Main extends Sprite {
private var _testGetSet:uint;
private var directLink:Function;
function Main() {
testGetSet = 20;
directLink(30);
trace(_testGetSet);
}
public function get testGetSet():uint { return _testGetSet; }
public function set testGetSet(value:uint):void {
_testGetSet = value;
if(!directLink) directLink = arguments.callee;
}
}
}
bicubic_bublic
09.11.2009, 13:37
...
Проще тогда сделать будет таким образом:
private var _parameter:...;
public function set parameter(value:...):void {
setParameter(value);
}
public function setParameter(value:...):void {
_parameter = value;
}
Партизан
09.11.2009, 13:50
Не прикольно конечно из сеттера функцию делать, но я бы сделал так
function(val:*):void{setter=val}
switcher!
09.11.2009, 14:31
bicubic_bublic, я дал ответ в строгости с сабжем + потому, что:
видимо, это действительно так: нельзя получить ссылку на функцию сеттер-геттер
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.