У меня есть ситуация, когда я хочу, чтобы нормальное свойство отображалось только в производном классе со значением по умолчанию. Я использую ключевое слово нового для этой цели следующим образом:Изменить свойство BaseClass на readonly в DerivedClass с новым и переопределить
public abstract class BaseClass
{
public virtual string SomeInfo { get; set; }
}
public class DerivedClass1 : BaseClass
{
public new string SomeInfo => "ChildInfo1"; // C# 6.0 equivalent of { get { return "ChildInfo1"; } }
}
Он отлично работает, и new DerivedClass1().SomeInfo
не может быть назначен - это неизменяемый. Я понимаю, что можно было бы получить доступ к нему через базовый класс:
BaseClass b1 = new DerivedClass1();
b1.SomeInfo = "ChildInfo1 changed";
Я просто хочу неспособный пользователю изменить его случайно, и через базовый класс было бы нарочно в таком случае это acceptible.
Однако если производный класс будет так:
public class DerivedClass2 : BaseClass
{
public override string SomeInfo => "ChildInfo2";
}
Тогда это свойство будет доступно, и вы могли бы, казалось бы изменить его, но он не будет изменен, и я хотел бы понять, почему?
var d2 = new DerivedClass2();
d2.SomeInfo = "ChildInfo2 changed";
Console.WriteLine(d2.SomeInfo); // output: ChildInfo2
UPDATE:
Я добавил новый ответ, как третий вариант, пожалуй, лучше всего.
* «Я просто хочу, чтобы неспособный пользователю изменить его случайно, и через базовый класс было бы нарочно в таком случае это acceptible» * Это «специально», если программист вызывает метод, принимающий параметр «BaseClass», где - неизвестный программисту - этот метод меняет «SomeInfo»? В любом случае то, что вы предлагаете, нарушает [принцип Лисковского подмены] (https://en.wikipedia.org/wiki/Liskov_substitution_principle) и должно рассматриваться с подозрением. –
Я думал, что это может нарушить LSP. Есть ли другой (лучший) способ достичь этого, не нарушая его? – borisdj
Ну, вы могли бы создать интерфейс, который был доступен только для чтения, и передать его, но, конечно, это потребует модификации существующих методов, поэтому это может быть не вариант. –