一个类的一个构造函数及其嵌套类

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)

我似乎无法找到类似设置的任何示例.我怎么能做到这一点?

Onl*_*ere 7

而不是让你的构造函数有这么多参数,为什么不做这样的事情?

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)

但是,用这种方式做事就是一种代码味道.最好在构造函数调用中使用已创建和实例化的成员.无论哪种方式,这都是个人选择.


Jai*_*res 6

你甚至不需要构造...只需使用初始化器:

   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)

  • 你是对的,显然我的答案不会编译,但我们会假设他会在引用这些类的主类中添加属性.否则他们永远不会暴露.仅仅因为类嵌套在这个类中并不意味着它们不能被外部引用,只是有问题的设计. (2认同)