4 に答える
コンストラクターに非常に多くのパラメーターを持たせる代わりに、このようなことをしてみませんか?
public class Room
{
public Room(Suspect suspect, Weapon weapon)
{
SuspectInRoom = suspect;
WeaponInRoom = weapon;
}
public Suspect SuspectInRoom { get; set; }
public Weapon WeaponInRoom { get; set; }
}
// Example usage:
Suspect coronelCustard = new Suspect("Coronel Custard");
Weapon musket = new Weapon("Musket");
Room someRoom = new Room(coronelCustard, musket);
// Then your room can be used to access all sorts of data.
Console.WriteLine(someRoom.SuspectInRoom.Nickname); // "The Big Kahuna"
Console.WriteLine(someRoom.WeaponInRoom.AttackDamage); // "20"
ネストされたクラスがメイン クラスに導入された場合、それらの初期化はメイン クラスとの共有コンストラクターを介して処理できますか? 最終的には、3 つのクラスすべてを同じ行で初期化したいと考えています...
ネストされたクラスに public コンストラクターがある場合は、それを行うことができます。
例:
Room someRoom = new Room(new Suspect("Colonel Custard"), new Weapon("Musket"));
しかし、このように物事を行うのは一種のコードの匂いです。コンストラクターの呼び出しでは、既に作成およびインスタンス化されたメンバーを使用することをお勧めします。どちらにしても個人の自由です。
コンストラクタさえ必要ありません...イニシャライザを使用するだけです:
var room = new Room { Name = "Library",
Width = 7,
Height = 3,
Suspect = new Suspect { Name = "Professor Plum",
PlaysCroquet = false },
Weapon = new Weapon { Name = "Candlestick",
IsShiny = true }
};
これを行う簡単な方法は、Suspect クラスと Weapon クラスに public コンストラクターを与えて、Room クラスの外部でインスタンス化できるようにすることです (クラスは public と宣言されているため、これは受け入れられると思います)。
Room コンストラクターは、Suspect と Weapon への参照を取得できます。これにより、Suspect オブジェクトと Weapon オブジェクトを以前の時点で作成し、それらを構築時に Room に渡す柔軟性が得られます。また、Room クラスのコンストラクタが Suspect クラスと Weapon クラスのプロパティを知る必要がなくなります (また、作成時に変更が必要になります)。それらに追加します)。
簡潔にするために、次のようにすべてのオブジェクトを 1 行で作成することもできます。
Room[i] = new Room("Library", 8, 5, new Suspect("Professor Plum", false), new Weapon("Candlestick", true));
クラス自体を初期化する必要はありません。メンバーは必要です。
コンストラクターに渡す引数と、コンストラクターで初期化するクラスのメンバーには、正式な制限はありません。フィールドまたはプロパティのタイプがたまたまネストされたクラスである場合、int
それstring
はコンストラクターの観点*と同じです。
*: 唯一の潜在的な違いは、クラスのインスタンスで直接設定できるパブリック読み取り/書き込みプロパティとは異なり、非パブリックのネストされたクラスの型のメンバーを他のメソッドまたはコンストラクターで初期化する必要があることです。