Как скрыть поле поддержки от остальной части класса

Есть ли способ заставить остальную часть моего класса получить доступ к установщику свойств, а не к вспомогательному полю? Рассмотрим следующий неуклюжий код:

public class Brittle
{
    private string _somethingWorthProtecting;
    public string SomethingWorthProtecting
    {
        get { return _somethingWorthProtecting; }
        set
        {
            _somethingWorthProtecting = value;
            ReallyNeedToDoThisEverTimeTheValueChanges();
        }
    }

    public void OhDearWhatWasIThinking()
    {
        _somethingWorthProtecting = "Shooting myself in the foot here, aren't I?";
    }
}

Насколько я знаю, C# не предоставляет какого-либо механизма, который не позволил бы разработчику класса совершить эту ошибку. (Авто-свойства явно не подходят в этой ситуации.) Существует ли схема проектирования или практика, которая может помочь защитить от таких непреднамеренных переходов?

1 ответ

Решение

Вы можете переместить эту логику в абстрактный базовый класс:

public abstract class Brittle
{
    private string _somethingWorthProtecting;
    public string SomethingWorthProtecting 
    {
        get { return _somethingWorthProtecting; }
        set
        {
            _somethingWorthProtecting = value;
            ReallyNeedToDoThisEverTimeTheValueChanges();
        }
    }

    //.....
}

тогда вы можете быть уверены, что никто не будет создавать экземпляр этого класса, а производные классы не смогут получить доступ к закрытому полю.

public class BrittleDerived : Brittle
{
     public void DoSomething() 
     {
        // cannot access _somethingWorthProtecting;
     }
}
Другие вопросы по тегам