Проблема свойств C#

На днях я врезался в небольшую проблему относительно свойств C#.

Скажем, у меня есть эта установка:

public class Point
{
 public float X;
 public float Y;
}

public class Control
{
 protected Point m_Position = new Point();

 public Point Position
 {
  get { return m_Position; }
  set 
  { 
    m_Position = value; }
    // reorganize internal structure..
    reorganize();
  }

  protected reorganize()
  {
   // do some stuff
  }
}

Это - весь штраф, но когда дело доходит до использования, я мог записать что-то как:

Control myControl = new Control();
myControl.Position.X = 1.0f;

Вещь, мой Control класс не распознает что Position был изменен потому что set() не был назван.

Есть ли способ сделать Control зная о любом Position изменения?

6
задан Null 12 August 2015 в 20:21
поделиться

5 ответов

В этом случае есть несколько вариантов:

  1. Сделать свойства X и Y вашего класса Point неизменяемыми. То есть требовать, чтобы пользователь создавал новую точку при изменении X или Y.
  2. Установите событие в классе Point и подпишитесь на него в классе Position. Каждый раз, когда X или Y точки меняется, запускайте событие. Класс Position может обрабатывать побочные эффекты в обработчике событий.

В этом случае я бы предложил вариант №1

7
ответ дан 17 December 2019 в 00:06
поделиться

Это должно исправить! Я добавил строку в ваш получатель, которая проверяет, является ли точка нулевой и создает ли она ее перед возвратом.

public class Point
{
 public float X;
 public float Y;
}

public class Control
{
 protected Point m_Position = new Point();

 public Point Position
 {
  get 
  { 
      if (m_Position == null) m_Position = new Point();
      return m_Position; 
  }
  set 
  { 
    m_Position = value; 
    // reorganize internal structure..
    reorganize();
  }

  }

  protected reorganize()
  {
   // do some stuff
  }
}

HTH

-3
ответ дан 17 December 2019 в 00:06
поделиться

Вы можете сделать открытый класс Point общедоступной структурой Point . Таким образом, компилятор заставит вас написать

myControl.Position = new Point() { X = 1.0f, Y = myControl.Position.Y; }

, и будет вызвано средство задания свойств.

0
ответ дан 17 December 2019 в 00:06
поделиться

1) Сделайте Point.X и Point.Y закрытыми. 2) Добавить свойства для X и Y в Point. 3) Добавьте событие в Point, которое возникает при изменении X или Y. 4) Зарегистрируйте элемент управления в качестве прослушивателя для событий, которые инициируются Точка.

1
ответ дан 17 December 2019 в 00:06
поделиться

Оператор myControl.Position.X = 1.0f; на самом деле вызывает геттер, а не сеттер вашего свойства Position . Одним из способов сделать то, что вы хотите, может быть предоставление значений X и Y непосредственно в вашем классе, например:

public class Control  
{  
 protected Point m_Position = new Point();  

 public float PositionX
 {  
  get { return m_Position.X; }  
  set   
  {   
    m_Position.X = value; }  
    // reorganize internal structure..  
    reorganize();  
  }  

  ... Same thing for PositionY

  protected reorganize()  
  {  
   // do some stuff  
  }  
}

Другой способ - реализовать какое-то событие в Position , который вызывается каждый раз при изменении X или Y. Это повлечет за собой преобразование X и Y в свойства объекта Point и создание события при каждом их изменении. Тогда ваш элемент управления должен будет подписаться на это событие.

2
ответ дан 17 December 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: