Я использовал этот шаблон (не знаком с C # как таковым, но идея должна работать):
class Foo
{
protected int id;
public int GetID()
{
return (ID);
}
}
class MutableFoo : Foo
{
public void SetID(int val)
{
id = val;
}
}
тогда пользовательский интерфейс имеет дело только с классом "Foo", который доступен только для чтения, в то время как другие части могут иметь дело с "MutableFoo", который предназначен для чтения / записи. Вы должны иметь возможность только когда-либо создавать экземпляры "MutableFoo" и затем передавать их другим частям кода, который получает затем как "Foo", этот код пользовательского интерфейса будет иметь доступ только для чтения к объектам, в то время как другие части могут читать -записать доступ.
Возможно, я бы тоже сделал абстрактным "Foo" (я не могу вспомнить случай, когда я этого не сделал).