Есть случаи, когда шаблон, который вы описываете, оправдан. Например, может быть полезно иметь абстрактный класс MaybeMutableFoo
, из которого производные подтипы MutableFoo
и ImmutableFoo
. Все три класса включают имущество IsMutable
и методы AsMutable()
, AsNewMutable()
и AsImmutable()
.
В этой ситуации было бы полностью правильным, чтобы MaybeMutableFoo
обнаружил свойство чтения-записи, если его контракт явно указывает, что установщик может не работать, если IsMutable
не возвращает true. Объект, который имеет поле типа MaybeMutableFoo
, которое имеет место с экземпляром ImmutableFoo
, может быть совершенно доволен этим экземпляром, если до или после него он не должен был писать на него, после чего он заменил бы поле объектом, возвращаемым через AsMutable()
, а затем использовал его как измененный foo (он знал бы, что он изменен, поскольку он только что заменил его).При наличии MaybeMutableFoo
включите сеттер, чтобы избежать необходимости делать какие-либо будущие придания типов в поле, как только оно было сделано для обращения к изменяемому экземпляру.
Лучший способ разрешить такой шаблон - избежать реализации виртуальных или абстрактных свойств, а вместо этого реализовать не виртуальные свойства, чьи геттеры и сеттеры привязаны к виртуальным или абстрактным методам. Если один имеет базовый класс
public class MaybeMutableFoo
{
public string Foo {get {return Foo_get();} set {Foo_set(value);}
protected abstract string Foo_get();
protected abstract void Foo_set(string value};
}
то производный класс ImmutableFoo
может объявить:
new public string Foo {get {return Foo_get();}
сделать его Foo
свойство только для чтения, не мешая с возможностью кодировать переопределения для абстрактного Foo_get()
и Foo_set()
методов. Обратите внимание, что замена только для чтения Foo
не изменяет поведение свойства get; цепочки версий, доступные только для чтения, для того же метода базового класса, что и свойство базового класса. Выполнение этого способа гарантирует, что есть одна точка патча для изменения свойства getter и одна для изменения сеттера, и эти точки патча не будут меняться, даже если само свойство будет переопределено.
Нам нужно больше контекста, я думаю. – Noldorin