Как предоставлять правильный доступ к protected полям в таком случае?
Вообще вызов расчёта из геттера свойства - плохо. И ваша - лишь одна из причин.
С моей точки зрения, поддержка актуального состояния класса - задача самого класса. Если требуется пересчёт, то его надо выполнять при изменении состояния класса (в момент изменения параметров для пересчёта), а не при первой попытке считывания результата (впрочем, случаи разные бывают).
Во вторых, naming convention - все локальные поля должны отличаться от имени внешних свойств. Я, например, все локальные переменные класса снабжаю префиксом m_ (в вашем примере это будет m_Bar.
Советую прочитать для начала https://ru.scribd.com/document/56782158/All-In-One... Во вторых, продумывайте изначально структуру классов, не стоит давать защищенный доступ как бы на будущее, даже если писать код будете не вы.