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

时间:2012-07-13 15:43:50

标签: c# class constructor namespaces nested

为了这个例子,假设我们正在制作一个愚蠢的 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;
  }
}

在添加Suspect和Weapon类之前,Room构造函数看起来像:

public Room(string Name, int Width, int Height)
{
  this.Name = Name;
  this.Width = Width;
  this.Height = Height;
}

初始化一个房间过去很简单:Room[i] = new Room("Conservatory", 7, 3); - 但是在引入嵌套类之后,可以通过主类的共享构造函数来处理它们的初始化吗?类似的东西:

Room[i] = new Room("Library", 8, 5, "Professor Plum", true, "Candlestick", true);

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

4 个答案:

答案 0 :(得分: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"

  

当嵌套类被引入主类时,可以将它们   初始化通过与main的共享构造函数来处理   类?最终我希望同样初始化所有三个类   线...

如果您的嵌套类具有公共构造函数,则可以执行此操作。

示例:

Room someRoom = new Room(new Suspect("Colonel Custard"), new Weapon("Musket"));

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

答案 1 :(得分:5)

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

   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 }
                        };

答案 2 :(得分:2)

一个简单的方法是给Suspect和Weapon类提供公共构造函数,这样它们就可以在Room类之外实例化(我认为这是可以接受的,因为这些类被声明为public)。

Room构造函数可以接受对Suspect和Weapon的引用。这使您可以灵活地在某个先前的点创建Suspect和Weapon对象,并将它们传递到构造中的Room中 - 它还可以防止Room类构造函数必须知道Suspect和Weapon类的属性(并且当您需要修改时)添加到他们)。

为简洁起见,您仍然可以在一行中构建所有对象,如下所示:

Room[i] = new Room("Library", 8, 5, new Suspect("Professor Plum", false), new Weapon("Candlestick", true));

答案 3 :(得分:1)

类本身不需要初始化,成员是。

对于传递给构造函数的参数以及在构造函数中初始化的类的成员,没有正式的限制。如果字段或属性的类型恰好是嵌套类 - 它与构造函数的观点 * 中的intstring没有区别。

*:唯一的潜在区别是非公共嵌套类的成员必须在其他一些方法或构造函数中初始化,而不像公共读/写属性也可以直接在类的实例上设置。 / p>