roboforum.ru

Технический форум по робототехнике.

Angel71

Правила форума
В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.

Re: Angel71, флудилка

=DeaD= » 27 май 2010, 19:04

Angel71 писал(а):хех, проблемка нарисовалась. есть базовый класс, в котором есть некая переменная (вполне возможно, что не переменная, а свойство со своими get/set). в классе наследнике нужно реализовать отслеживание изменения переменной. :sorry: немогу вспомнить как такое реализуется и возможно ли вообще.

Как тупой универсальный вариант - реализовать подписку на изменения :)

Добавлено спустя 35 секунд:
Хоть откуда будешь знать об изменениях. Для защиты можно функции подписки сделать доступными только наследникам.

Re: Angel71, флудилка

D1mcon » 27 май 2010, 19:07

Самый простой вариант - переменная private, все действия над ней через соответствующие методы, которые и уведомят кого надо.

Re: Angel71, флудилка

Angel71 » 27 май 2010, 19:11

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

Добавлено спустя 2 минуты 26 секунд:
=DeaD=, яб с удовольствием подписалсяб на получение уведомлений об изменениях, но в базовом классе уведомления не рассылаются.

Re: Angel71, флудилка

=DeaD= » 27 май 2010, 19:11

А что насчет подписки? :)

Re: Angel71, флудилка

D1mcon » 27 май 2010, 19:15

2Angel71 Кто-то вызывает метод для работы с этой переменной, а сам метод генерит событие соответствующее действию над переменной.
2=DeaD= не понял проблемы подписки. :unknown:

Можно и без событий через шаблоны. Шаблон "наблюдатель" используют обычно при работе с UI но, по-моему, он и здесь поможет.


Плохой вариант - проверка переменной по таймеру.
Последний раз редактировалось D1mcon 27 май 2010, 19:17, всего редактировалось 1 раз.

Re: Angel71, флудилка

Angel71 » 27 май 2010, 19:17

:oops: для подписки вроде как нужны события, а у меня в наличии только DataReceived, Disposed, ErrorReceived и PinChanged. или я не очень понял о чём речь или может не владею знанием нужных фенечек

Добавлено спустя 48 секунд:
D1mcon, да и эти кто-то сидят в базовом классе.

Re: Angel71, флудилка

D1mcon » 27 май 2010, 19:21

Кажись догнал :) - мы не можем модифицировать базовый класс?

Re: Angel71, флудилка

=DeaD= » 27 май 2010, 19:24

Angel71 писал(а)::oops: для подписки вроде как нужны события

Ну так сделай механизм :)
Банальная функция регистрирующая в классе указатели на функции которые надо вызвать при изменении переменной.
Как только переменная поменялась - бежим по массиву указателей и дергаем за хвост всех кто просил.

Курить мануалы про вызов функции по указателю и передаче указателя на функцию в другую функцию для регистрации его там.

Re: Angel71, флудилка

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 раз.

Re: Angel71, флудилка

=DeaD= » 27 май 2010, 19:35

Ну это надо переопределять функцию set каждый раз при наследовании. Можно конечно и так. Но тогда о чем мы говорим про родительский класс? :)

Re: Angel71, флудилка

Angel71 » 27 май 2010, 19:38

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

Re: Angel71, флудилка

=DeaD= » 27 май 2010, 19:41

Angel71 писал(а):про родительский класс это к тому, что я понятия не имею где нужная переменная может меняться. вопрос в том как отследить и возможно ли это вообще

Самый простой способ - закрыть переменную от наследников и дать им методы set,get,subscribe,unsubscribe и всё.

Re: Angel71, флудилка

Angel71 » 27 май 2010, 19:45

нет у меня доступа к коду базового класса, ничего я закрыть не могу и подписаться или отписаться на события не могу, в том то и кака. :sorry: либо я уже торможу
одно из полурешений было таким
Код: Выделить всёРазвернуть
        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");//создаём уведомление об изменении
            }
        }

Re: Angel71, флудилка

=DeaD= » 27 май 2010, 19:48

ну тогда переопредели метод set и сделай в нём вызов метода, который подергать надо.

Добавлено спустя 1 минуту 28 секунд:
Я не понимаю в чем проблема вообще - родительский класс охамел и меняет свою пропертю не через set?

Re: Angel71, флудилка

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 секунду:
да не. родительский класс явно всё нормульно делает, базовый класс мелкософтский.


Rambler\'s Top100 Mail.ru counter