Форма решения соответствует конкретной c проблеме. Из того, что я понимаю по вашему вопросу, вы хотите контролировать права на чтение / запись данных во время выполнения приложения. CvarRegistry приходит на ум. Пожалуйста, обратитесь к оригиналу от id Software, так как это всего лишь набросок.
public Cvar { }
public Cvar<T>
{
public T Value { get; set; }
}
public CvarRegistry : Dictionary<string, Cvar> { }
Вы можете динамически контролировать доступ путем: 1) добавления и удаления Cvars в доступную коллекцию (надеясь, что потребители этого не сделают держитесь за ссылки) 2) добавление версий только для получателя в доступную коллекцию, или 3) создание регулятора, который исключительно переключает состояние только для чтения каждого значения Cvar, что вызывает ветвление во время доступа сеттера.
К сожалению, Свойство объекта может быть целым объектом со своими собственными доступными свойствами, и поэтому утечка искусственного контроля. Реальная CvarRegistry плоская, так как каждый Cvar указывает на примитив. Я не нашел способа ограничить родовые типы примитивами, но я не считаю это необходимым.
OOP учит вас концептуализировать данные как личную собственность или состояние объекта. Осознание этого предположения вынуждает вас затем вручную доставлять значения «состояния» между «объектами». Это приводит к форме процесса, известного как распределенное производство . Каждый модуль OOP имеет избыточное (внутреннее) представление (общей) областей памяти, которыми они управляют, и отправляет друг другу электронные сообщения. Напротив, эталонные свойства (Cvars) позволяют различным модулям просто совместно использовать память.
public Cvar<int> x { get; set; }
public void M()
{
x.Value += 3;
}
public void N()
{
x.Value *= 4;
}
// N() could be a method in another class, another namespace
// and you would have zero coupling
Моя производственная архитектура представляет собой целую альтернативную парадигму OOP, где модули взаимодействуют с конечным продуктом, а не искусственно владеют и управление памятью, как будто это всегда внутреннее состояние. Таким образом, другой способ взглянуть на проблему - спросить, нужны ли «свойства объекта». Иногда они есть, но не в производственном контексте, который является большей частью кода.