Ich habe eine Situation, in der ich möchte, dass die normale Eigenschaft schreibgeschützt in der abgeleiteten Klasse mit dem Standardwert ist. Ich bin mit Stichwort neue zu diesem Zweck in der folgenden Art und Weise:Ändern der BaseClass-Eigenschaft in readonly in DerivedClass mit new und override
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"; } }
}
Es funktioniert gut, und new DerivedClass1().SomeInfo
kann nicht zugewiesen werden - es ist nur lesbar. Ich bin mir bewusst, dass man es durch Basisklasse zugreifen konnte:
BaseClass b1 = new DerivedClass1();
b1.SomeInfo = "ChildInfo1 changed";
ich nur nicht in der Lage Benutzer möge es versehentlich zu ändern, und durch Basisklasse wäre es absichtlich sein, in welchem Fall es acceptible ist.
Allerdings, wenn Abgeleitete Klasse wie folgt sein würde:
public class DerivedClass2 : BaseClass
{
public override string SomeInfo => "ChildInfo2";
}
Dann ist diese Eigenschaft wäre zugänglich und man kann es scheinbar ändern, aber es würde nicht geändert werden, und ich möchte verstehen, warum?
var d2 = new DerivedClass2();
d2.SomeInfo = "ChildInfo2 changed";
Console.WriteLine(d2.SomeInfo); // output: ChildInfo2
UPDATE:
Ich habe neue Antwort als dritte Option hinzugefügt, wahrscheinlich die beste.
* „Ich will nur nicht in der Lage Benutzer versehentlich ändern, und durch Basisklasse wäre es absichtlich sein, in welchem Fall es acceptible ist“ * Ist es "absichtlich", wenn der Programmierer eine Methode aufruft, die einen "BaseClass" -Parameter akzeptiert, wobei - unbemerkt vom Programmierer - diese Methode "SomeInfo" ändert? In jedem Fall verstößt das, was Sie vorschlagen, gegen das [Liskov-Substitutionsprinzip] (https://en.wikipedia.org/wiki/Liskov_substitution_principle) und sollte mit Argwohn betrachtet werden. –
Ich dachte, dass dies LSP verletzen könnte. Gibt es einen anderen (besseren) Weg, dies zu erreichen, ohne es zu verletzen? – borisdj
Nun, Sie könnten eine Schnittstelle erstellen, die schreibgeschützt ist und diese weitergeben, aber das würde natürlich erfordern, vorhandene Methoden zu ändern, so dass es möglicherweise keine Option ist. –