2016-10-16 7 views
0

不変オブジェクトパターンについて質問して実装しています。 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

+3

ここでも「AnotherPerson」は必要ありません。参照を再割り当てしただけです。元のオブジェクトは変更されていません。 –

+1

あなたは何も突然変異させませんでした。異なるデータを持つ別のオブジェクトを作成しました。 –

+0

最初:不変性は、言語構成よりも「良い習慣」です。 2番目:変数「me」を再割り当てしています。 封印されたクラスを使用したとしても、結果は同じになります。 – Trauer

答えて

0

です。私は現在、これがコンストラクタでのみ可能かどうかはわかりません。

(コメントはすでに述べたあなたが最初の実行"MyName"でそれを割り当てて、セカンドランであなたはのは、あなたの例の欠陥を忘れてみましょうあなたはnew AnotherPerson(...)

static void Main(string[] args) 
{ 
    Person me = new Prasanth("MyName"); 
    me.DisplayName(); 
    // vvvvvv here you lose the reference to the old object 
    me = new AnotherPerson("AnotherName"); ; 
    me.DisplayName(); 
    Console.ReadLine(); 
} 
+0

回答してくれてありがとう、私はこれを読んでいるので、私は不変のクラスは構成を格納するために使用できると思っていたデータ(web.config/app、config)。私は通常、その目的のために静的フィールドを使用し、私はどのように私はそのシナリオで不変オブジェクトを適用することができますかと思っていた。構成データの場合、私は誰にも改変させるべきではなく、設定から一度読んだだけです。だから、私の理解は間違っていたと私のシナリオでは、私はすべてのチュートリアルで説明されている不変オブジェクトパターンを適用することはできません。 – Prasanth

5

で作成completly別のオブジェクトに"AnotherName"をASSINGそれはすべて)、あなたの質問に答えてください: "なぜ変えられないクラスはC#で密閉されていませんか?"

事は、不変性はC#言語の特徴ではありません。一部の言語は不変性をフィーチャとしてサポートしています(この場合、ポイントは有効です)。しかし、C#ではサポートされていません。結局のところ、あなたはただ既存の汎用の機能から不変クラスを構築しています。したがって、制限が生じることがあります。

また、不変性は予防策であり、保護ではありません。重要な点は、誰かが「通常の」手段でデータを変更するのを防ぐことです。もし誰かが本当にデータを変更したいと思っているなら、例えば、リフレクション(またはあなたが言及したようにサブクラス化)を通して、いつでも行うことができます。しかし、開発者がそれを行うならば、彼は彼が読み込み専用であると思われるデータを変更していることを無視しているわけではありません。不変性のポイントは、開発者が無意識に足で自分を撃ってしまわないようにすることです。

+0

お返事ありがとうございます。 – Prasanth

関連する問題