На днях я врезался в небольшую проблему относительно свойств 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
изменения?
В этом случае есть несколько вариантов:
В этом случае я бы предложил вариант №1
Это должно исправить! Я добавил строку в ваш получатель, которая проверяет, является ли точка нулевой и создает ли она ее перед возвратом.
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
Вы можете сделать открытый класс Point
общедоступной структурой Point
. Таким образом, компилятор заставит вас написать
myControl.Position = new Point() { X = 1.0f, Y = myControl.Position.Y; }
, и будет вызвано средство задания свойств.
1) Сделайте Point.X и Point.Y закрытыми. 2) Добавить свойства для X и Y в Point. 3) Добавьте событие в Point, которое возникает при изменении X или Y. 4) Зарегистрируйте элемент управления в качестве прослушивателя для событий, которые инициируются Точка.
Оператор 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
и создание события при каждом их изменении. Тогда ваш элемент управления должен будет подписаться на это событие.