不変オブジェクトパターンについて質問して実装しています。 Stringのような.NETライブラリの既存のクラスについては言及していません。C#で不変クラスが封印されないのはなぜですか?
私は不変オブジェクトが一度ロードされたオブジェクトであることを、外部または内部コンポーネントによって変更できないことを理解しています。私が密閉されたクラスではないので、不変クラスをサブクラス化するとどうなりますか?次に、オブジェクトを基本クラスに割り当て、基本クラスのメソッドを呼び出します。私は事実上派生クラスオブジェクトの状態であるため、基本不変クラスの状態を効果的に変更しました。
public class Person
{
private readonly string name;
public Person(string myName)
{
this.name = myName;
}
public string Name
{
get { return this.name; }
}
public void DisplayName()
{
Console.WriteLine(string.Format("Person's name is {0}", this.name));
}
}
public class AnotherPerson : Person
{
private string name1;
public AnotherPerson (string myName) : base(myName)
{
this.name1 = myName;
}
}
class Program
{
static void Main(string[] args)
{
Person me = new Prasanth("MyName");
me.DisplayName();
me = new AnotherPerson("AnotherName"); ;
me.DisplayName();
Console.ReadLine();
}
}
出力:
人名はMYNAME
人名は、あなたが一度だけreadonly string name
を割り当てることができますAnotherName
ここでも「AnotherPerson」は必要ありません。参照を再割り当てしただけです。元のオブジェクトは変更されていません。 –
あなたは何も突然変異させませんでした。異なるデータを持つ別のオブジェクトを作成しました。 –
最初:不変性は、言語構成よりも「良い習慣」です。 2番目:変数「me」を再割り当てしています。 封印されたクラスを使用したとしても、結果は同じになります。 – Trauer