Технический форум по робототехнике.
		
	
		 
		
			Правила форума
			В данном разделе каждый может иметь не более одной темы. Тема должна начинаться с логина (ника) робофорума.
		
	
		
			
			
				
				 =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 секунду:да не. родительский класс явно всё нормульно делает, базовый класс мелкософтский.