2011-08-11 17 views
0
Fieldの値が DerivedADerivedBクラスに変更されるこのシナリオで
class BaseClass 
{ 
    public int Field = 1; 
} 
class DerivedA : BaseClass 
{ 
    public int SetField6() 
    { 
     return this.Field = 6; 
    } 
} 
class DerivedB : BaseClass 
{ 
    public int SetField16() 
    { 
     return this.Field = 16; 
    } 
} 

BaseClass x = new BaseClass(); 
int xField = x.Field; 

DerivedA y = new DerivedA(); 
int yField = y.SetField6(); 

DerivedB z = new DerivedB(); 
int zField = z.SetField16(); 

int baseField = new BaseClass().Field; 

からの値を変更し、BaseClassクラスのFieldの値は変更されません。したがって、baseFieldの値はまだ1です。派生クラス

  • それが派生クラスから、クラスでBaseClassFieldの値を変更することは可能ですか?
  • このシナリオのデザインパターンはありますか?それは何と呼ばれていますか?
+5

なぜ、わかりやすい名前を使用してすべてのコードを提供しますか?あなたはあなたが言っていることに従うことがどれほど難しい**知っていますか? –

+4

Ok ... 20分後、私はすべてをリファクタリングして言い換えました...うまくいけば、他の人のために今読むのが楽になるはずです。 –

+0

素晴らしいサービス、@ジェフ。人々はもっと頻繁にここで食事をしなければならない – Xiaofu

答えて

1

各オブジェクトをインスタンス化すると、オブジェクトクラスになるまでヒープ内に独自のメモリが作成されます。そして、階層のすべてのクラスのメンバー全員がスタックに作成されます(値型の場合)。

したがって、それぞれのケースでは異なります。あなたは(私は本当にあなたが達成しようとしているかを理解することはできませんが)あなたが欲しいものを得るために静的BaseClassのにフィールドを作ることができます

0

1

まず、修正かもしれないもの:あなたがして変更するフィールドを作成します基底クラスのサブクラスstatic私はこれが実際にあなたに期待している行動を与えるかどうかは分かりません。その行動が何であるかは不明だからです。この場合、すべてのインスタンスは同じ値を共有します。

第2に、ここでインスタンスとクラスを混同していると思うので、これはすべて不明です。

これにはかなり一般的なメタファーを使用することは、家のための青写真と家自体の違いです。

私が青写真Zから家を作り、その家の窓を壊したら、同じ青写真で作られた新しい家では窓が壊れないのはなぜですか?

このメタファの家はインスタンス(x)、青写真はクラス(BaseClass)です。

+0

問題は、その変更の後、コードはインスタンス参照を持つそのメンバーにもうアクセスできず、OPが実際にインスタンス参照を使用するように見えます。 – tzup

+1

あなたは本当にOPが望んでいることを理解できますか? –

0

1.派生クラスのクラスBaseClassのFieldの値を変更することはできますか?

あなたは実際にシナリオでこれを行っていますが、コードの最後の行で隠されています(新しいフィールド設定を1にする新しいオブジェクトをインスタンス化しているためです)。だから、代わりに呼び出す:

int baseField = new BaseClass().Field; 

使用この:

int baseField = y.Field; // baseField is now = 6 because Field was changed earlier by y.SetField6() 

この方法で、あなたは実際には、ベース部材のフィールドの値が派生クラス(から構築されたオブジェクトによって変更されていることがわかります実際の修正はy.SetField6()を呼び出すことによって行われました。

2.このシナリオのデザインパターンはありますか?

はい、オブジェクト継承と呼ばれます。