Вы утверждаете, что ваши свойства имеют отношение "A * B = C". Итак, ваш класс должен это выразить. A и B являются независимыми переменными, поэтому у них есть простые установщики и получатели, которые просто получают и устанавливают поле. C является зависимой переменной, поэтому она должна иметь только геттер и выполнять вычисления на основе A и B:
class Foo
{
private double m_a;
public double A
{
get { return m_a; }
set { m_a = value; }
}
private double m_b;
public double B
{
get { return m_b; }
set { m_b = value; }
}
public double C
{
get { return A * B; }
}
}
Можно написать редактор, который позволяет редактировать A и B тривиально. Он также может позволить пользователю редактировать C, если (и только если) пользователь уже отредактировал A или B. Представление будет хранить некоторое состояние, чтобы указать, какое (если таковое имеется) поле было отредактировано последним, и, следовательно, может применить соответствующее изменение к A или B при редактировании концептуального C.
Теперь, если View не знает о вычислении C, вы можете добавить методы к классу Foo в «SetAGivenC ()» и «SetBGivenC ()»:
class Foo
{
... as above ...
public void SetAGivenC( double newC )
{
A = newC/B;
}
public void SetBGivenC( double newC )
{
B = newC/A;
}
}
Теперь ваш GUI просто вызывает один из этих методов при редактировании "C".
Я не совсем понимаю, что означает последнее поле, заданное пользователем. Представьте, что на экране есть два редактора (оба связаны с одним экземпляром Foo), и пользователь редактирует A в первом редакторе, затем B во втором, а затем C в первом. Что настраивается при установке C? А или Б? Если вы можете ответить на этот вопрос, вы будете знать, какой класс должен отслеживать «последнее поле, заданное пользователем» - это должна быть модель или представление? Я ожидаю, что A будет скорректирована в этом случае и вид отслеживает последнее отредактированное поле. Но это проблема для другого дня!
Edit:
Джиперс - я даже собрал собственный патологический случай!
Я попробую последний абзац еще раз:
Я не совсем понимаю, что означает последнее поле, заданное пользователем. Представьте, что на экране есть два редактора (оба связаны с одним и тем же экземпляром Foo), и пользователь редактирует A, затем B в первом редакторе, затем пользователь редактирует B, затем A во втором, затем пользователь редактирует C в первом , Что настраивается при установке C? А или Б? Если вы можете ответить на этот вопрос, вы будете знать, какой класс должен отслеживать «последнее поле, заданное пользователем» - это должна быть модель или представление? Я ожидаю, что A будет скорректирована в этом случае и вид отслеживает последнее отредактированное поле. Но это проблема для другого дня!