我正在研究一个项目,并且我有一个对象,在实例化时会传递大量值(20+)。我知道我可以创建一个能够接受所有值的构造函数,但我正在寻找一种更清晰/更有效的方法来实现这一点。
只是为了透视,对象是游戏中的角色,经常创建新的实例。分配的值是随机生成的属性。
具有大量参数的构造函数是最好的方法吗?或者有更好的方法来做我不知道的事情吗?任何建议都将不胜感激。
编辑:当新游戏开始时,创建List<Character>
并且for循环创建10个角色实例并将它们添加到列表中。
答案 0 :(得分:13)
您可以创建定义游戏角色的通话。让用户填充该类并将其作为参数传递给您的类。
这样的事,
public class CharecterInfo
{
public string Name {get;set;}
public int Power {get;set;}
public int Health{get;set;}
}
public class Charecter
{
public Charecter(CharecterInfo charecterInfo)
{
//import values
}
}
我会避免使用公共属性,因为你的类可以在没有正确初始化(处于错误状态)时使用,这是构造函数的工作。你应该使用构造函数并在允许用户继续之前验证输入。
答案 1 :(得分:2)
如果属性具有公共设置器,则可以使用对象initialization syntax,例如:
Character c = new FooCharacter() {
Name = "Ugly Monster",
HP = 10000,
....,
};
编辑:正如评论中所指出的,这假定您的构造函数(空或具有最小参数)将使用有效数据初始化所有必需属性。初始化语法只是语法糖,它在构造函数初始化对象后设置任何指定的属性。
答案 2 :(得分:1)
这完全取决于这些论点是什么......但一般来说,拥有庞大的参数列表并不是一个好主意。这是因为它产生的混淆是什么参数。例外情况是你有一个带有键/值对的可变长度参数列表,允许你以未定义的顺序传递数据。
另一种方法是创建另一个代表所有参数的类。你可以创建一个这样的实例,设置相关的字段并传入它。为了扩展这个想法,你可以将该类分解为几个类,然后提供一些构造函数,这些构造函数采用不同的组合。
这种方法的有用之处在于您可以为任何参数设置默认值。通常,如果要为参数列表中的某些内容指定值,但对其余部分使用默认值,则必须填写其间的所有默认值。使用此方法,您可以使用除要指定的值之外的所有默认值。
答案 3 :(得分:1)
您有几种选择:
如果需要所有值:
如果不是所有值都是必需的,您可以使用Builder-pattern:
此链接详细描述了模式:http://cdmckay.org/blog/2009/07/03/joshua-blochs-builder-pattern-in-csharp/
答案 4 :(得分:1)
一种可能性在于OOAD本身。角色属性听起来像一个足够大的关注点,是你的角色类与之合作的独特类的责任。
对您的域名进行快速CRC分析可能有助于确定一个或多个新区分的职责&amp;目前缺少的相应类型。
答案 5 :(得分:1)
您可以创建一个返回类实例的方法。也许甚至在那个班级本身。
类似的东西:
public class Character
{
public string Name;
public int Level;
static Random random = new Random();
public static Character CreateNew()
{
Character newOne = new Character();
newOne.Level = random.Next(1, 5);
newOne.Name = (random.Next(1, 2) == 1) ? "Me" : "You";
return newOne;
}
}