2017-08-11 2 views
0

私はレベルがそのコンストラクタを介してオブジェクトを作成し、非常に基本的なシステムをセットアップしようとしている:同じオブジェクトの異なるインスタンスに異なる値の変数を割り当てる方法はありますか?

class Levels 
{ 
    // private level properties 
    private static string levelName { get; set; } 
    private static int levelSize { get; set; } 
    private static int levelNum { get; set; } 

    // new level constructor. Takes name, size (to square) and level number. 
    public Levels(string inName, int inSize, int inNum) 
    { 
     levelName = inName; 
     levelSize = inSize; 
     levelNum = inNum;      
    } 

    // ... GetLevel methods here... 
} 

とオブジェクトの各特定のインスタンスにそれらの値を割り当てます。しかし、levelName、levelSize、およびlevelNum変数が各インスタンスに適切に「固執」していないことが出力からわかります。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var Level1 = new Levels("Forest", 15, 1); 
     var Level2 = new Levels("Desert", 22, 2); 

     Console.WriteLine($"--- {Level1.GetLevelName()}, level {Level1.GetLevelNum()} ---"); 
     Console.WriteLine($"--- {Level2.GetLevelName()}, level {Level2.GetLevelNum()} ---"); 

     Console.ReadLine(); 
    } 
} 

// output: 
//  --- Desert, level 2 --- 
//  --- Desert, level 2 --- 
// why is level 1 not displaying here? 

は、私が最初にWriteLineメソッドコマンドの後にレベル2のコンストラクタを移動した場合、それは、hamfistedly、仕事は、しかし、明らかに、私は自分のインスタンスに固執し、それらの値を必要とすることを承知しています。

+0

オブジェクトのインスタンスを持つことはできません。オブジェクトはクラスのインスタンス*です。 – idmean

+0

おっと!うん、そうだね、それを指摘してくれてありがとう。 –

答えて

7

キーワードstatic変数がインスタンスレベルが、クラスレベルではないことを意味します。変数がLevelsクラスのすべてのインスタンスで共有されることを意味します。

私はそれを書き換えることをお勧め:private staticであるあなたの変数の代わりに

public class Levels 
{  
    public string LevelName { get; private set; } 
    public int LevelSize { get; private set; } 
    public int LevelNum { get; private set; } 

    // new level constructor. Takes name, size (to square) and level number. 
    public Levels(string inName, int inSize, int inNum) 
    { 
     LevelName = inName; 
     LevelSize = inSize; 
     LevelNum = inNum;      
    } 
} 

を、あなたは今、民間のセッターを持ってプロパティを使用します(これらは唯一のクラス内で設定することができますを意味します)。 の各インスタンスLevelsにはそれぞれ固有の値があり、インスタンス間で何も共有されません。これにより、GetLevelName(),GetLevelNum()などのメソッドも不要になるという追加のボーナスも得られます。今度は次のように言うことができます:

Console.WriteLine($"--- {Level1.LevelName}, level {Level1.LevelNum} ---"); 

私はデモのためにフィドルを作った。

+1

@maccetturaのように見えます。 –

+1

これは意味がある、ありがとう! –

+0

@ErinW。あなたは歓迎です、幸運です! – maccettura

2

フィールドからキーワードstaticを削除します。基本的にstaticキーワードは、このフィールドがこのクラスのすべてのインスタンスで同じであることを意味します。

関連する問題