444*_*444 6 c# constructor nested namespaces class
为了这个例子,假设我们正在制作一个愚蠢的Clue™游戏.我们在大厦中的每个房间都有一个班级,每个房间都有可疑和武器的子类.就像是:
class Room
{
public string Name;
public int Width;
public int Height;
// and so on...
public class Suspect
{
public string Name;
public bool isPurple;
}
public class Weapon
{
public string Name;
public bool IsMetal;
}
}
Run Code Online (Sandbox Code Playgroud)
在添加Suspect和Weapon类之前,Room构造函数看起来像:
public Room(string Name, int Width, int Height)
{
this.Name = Name;
this.Width = Width;
this.Height = Height;
}
Run Code Online (Sandbox Code Playgroud)
初始化一个房间过去很简单:Room[i] = new Room("Conservatory", 7, 3);- 但是在引入嵌套类之后,可以通过与主类的共享构造函数来处理它们的初始化吗?就像是:
Room[i] = new Room("Library", 8, 5, "Professor Plum", true, "Candlestick", true);
Run Code Online (Sandbox Code Playgroud)
我似乎无法找到类似设置的任何示例.我怎么能做到这一点?
而不是让你的构造函数有这么多参数,为什么不做这样的事情?
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"
Run Code Online (Sandbox Code Playgroud)
当嵌套类被引入主类时,它们的初始化是否可以通过与主类的共享构造函数来处理?最终我希望在同一行中初始化所有三个类......
如果您的嵌套类具有公共构造函数,则可以执行此操作.
例:
Room someRoom = new Room(new Suspect("Colonel Custard"), new Weapon("Musket"));
Run Code Online (Sandbox Code Playgroud)
但是,用这种方式做事就是一种代码味道.最好在构造函数调用中使用已创建和实例化的成员.无论哪种方式,这都是个人选择.
你甚至不需要构造...只需使用初始化器:
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 }
};
Run Code Online (Sandbox Code Playgroud)