Технический форум по робототехнике.
Правила форума
В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.
=DeaD= » 27 май 2010, 19:04
Angel71 писал(а):хех, проблемка нарисовалась. есть базовый класс, в котором есть некая переменная (вполне возможно, что не переменная, а свойство со своими get/set). в классе наследнике нужно реализовать отслеживание изменения переменной.
немогу вспомнить как такое реализуется и возможно ли вообще.
Как тупой универсальный вариант - реализовать подписку на изменения
Добавлено спустя 35 секунд:Хоть откуда будешь знать об изменениях. Для защиты можно функции подписки сделать доступными только наследникам.
D1mcon » 27 май 2010, 19:07
Самый простой вариант - переменная private, все действия над ней через соответствующие методы, которые и уведомят кого надо.
Angel71 » 27 май 2010, 19:11
D1mcon, не очень понял как мне события помогут, если в базовом классе их не будут вызывать. по сути я сейчас как раз и реализую события, оповещающие, что переменная изменилась.
Добавлено спустя 2 минуты 26 секунд:
=DeaD=, яб с удовольствием подписалсяб на получение уведомлений об изменениях, но в базовом классе уведомления не рассылаются.
=DeaD= » 27 май 2010, 19:11
А что насчет подписки?
D1mcon » 27 май 2010, 19:15
2Angel71 Кто-то вызывает метод для работы с этой переменной, а сам метод генерит событие соответствующее действию над переменной.
2=DeaD= не понял проблемы подписки.
Можно и без событий через шаблоны. Шаблон "наблюдатель" используют обычно при работе с UI но, по-моему, он и здесь поможет.
Плохой вариант - проверка переменной по таймеру.
Последний раз редактировалось
D1mcon 27 май 2010, 19:17, всего редактировалось 1 раз.
Angel71 » 27 май 2010, 19:17
для подписки вроде как нужны события, а у меня в наличии только DataReceived, Disposed, ErrorReceived и PinChanged. или я не очень понял о чём речь или может не владею знанием нужных фенечек
Добавлено спустя 48 секунд:D1mcon, да и эти кто-то сидят в базовом классе.
D1mcon » 27 май 2010, 19:21
Кажись догнал
- мы не можем модифицировать базовый класс?
=DeaD= » 27 май 2010, 19:24
Angel71 писал(а)::oops: для подписки вроде как нужны события
Ну так сделай механизм
Банальная функция регистрирующая в классе указатели на функции которые надо вызвать при изменении переменной.
Как только переменная поменялась - бежим по массиву указателей и дергаем за хвост всех кто просил.
Курить мануалы про вызов функции по указателю и передаче указателя на функцию в другую функцию для регистрации его там.
Angel71 » 27 май 2010, 19:32
пока реализовано примерно так. Class1 это для примера, вообще тот класс это в стандартных библиотеках
- Код: Выделить всё • Развернуть
public class Class1
{
private bool _b = false;
public bool b
{
get { return _b; }
set { _b = value; }
}
public void Open()
{
b = true;
}
public void Close()
{
b = false;
}
...
в любой момент где-то может быть вот такое присваивание
b=false;
...
}
наследую примерно так
- Код: Выделить всё • Развернуть
public class Class2 : Class1
{
new public bool b
{
get { return base.b; }
set
{
base.b = value;
NotifyPropertyChanged("b");//генерируем уведомление об изменении
}
}
public void Open()
{
b = true;
}
public void Close()
{
b = false;
}
}
Последний раз редактировалось
Angel71 27 май 2010, 19:36, всего редактировалось 1 раз.
=DeaD= » 27 май 2010, 19:35
Ну это надо переопределять функцию set каждый раз при наследовании. Можно конечно и так. Но тогда о чем мы говорим про родительский класс?
Angel71 » 27 май 2010, 19:38
про родительский класс это к тому, что я понятия не имею где нужная переменная может меняться. вопрос в том как отследить и возможно ли это вообще
=DeaD= » 27 май 2010, 19:41
Angel71 писал(а):про родительский класс это к тому, что я понятия не имею где нужная переменная может меняться. вопрос в том как отследить и возможно ли это вообще
Самый простой способ - закрыть переменную от наследников и дать им методы set,get,subscribe,unsubscribe и всё.
Angel71 » 27 май 2010, 19:45
нет у меня доступа к коду базового класса, ничего я закрыть не могу и подписаться или отписаться на события не могу, в том то и кака.
либо я уже торможу
одно из полурешений было таким
- Код: Выделить всё • Развернуть
private bool _last_b = false;
new public bool b
{
get
{
if(_last_b!= base.b)
{
_last_b = base.b;
NotifyPropertyChanged("b");//создаём уведомление об изменении
}
return base.b;
}
set
{
base.b = value;
NotifyPropertyChanged("b");//создаём уведомление об изменении
}
}
=DeaD= » 27 май 2010, 19:48
ну тогда переопредели метод set и сделай в нём вызов метода, который подергать надо.
Добавлено спустя 1 минуту 28 секунд:
Я не понимаю в чем проблема вообще - родительский класс охамел и меняет свою пропертю не через set?
Angel71 » 27 май 2010, 19:53
так вот же, делал
- Код: Выделить всё • Развернуть
public class Class2 : Class1
{
new public bool b
{
get { return base.b; }
set
{
base.b = value;
NotifyPropertyChanged("b");//генерируем уведомление об изменении
}
}
...
}
но этож будет работать только, если вызываются переопределённые методы. код в базовом классе их не вызовет
Добавлено спустя 2 минуты 1 секунду:да не. родительский класс явно всё нормульно делает, базовый класс мелкософтский.