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

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

6 голосов
/ 22 апреля 2010

На днях я столкнулся с небольшой проблемой, касающейся свойств 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 изменениях?

Ответы [ 5 ]

7 голосов
/ 22 апреля 2010

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

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

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

2 голосов
/ 22 апреля 2010

Оператор 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 и вызов события при каждом их изменении. Ваш контроль должен был бы подписаться на это событие.

1 голос
/ 22 апреля 2010

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

0 голосов
/ 22 апреля 2010

Вы можете сделать public class Point a public struct Point.Таким образом, компилятор заставит вас написать

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

и вызывать установщик свойства.

0 голосов
/ 22 апреля 2010

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

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
  }
}

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...