6
4

4 回答 4

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"

将嵌套类引入主类时,是否可以通过与主类共享的构造函数来处理它们的初始化?最终我希望在同一行中初始化所有三个类......

如果您的嵌套类有一个公共构造函数,您可以这样做。

例子:

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

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

于 2012-07-13T15:48:21.253 回答
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 }
                        };
于 2012-07-13T15:49:29.303 回答
2

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

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));
于 2012-07-13T15:51:01.370 回答
1

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

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

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

于 2012-07-13T15:52:57.153 回答