所以我想知道如何在这里保存代码。我想使用initializeCombatship()
,这样我就不必一遍又一遍地输入CombatShip goliath = new CombatShip();
。我想创建这艘船然后给它10 HP。感谢您的投入。
public int HP { get;set; }
public int initializeCombatship()
{
CombatShip goliath = new CombatShip(); //How do you make this public and not have to type this over and over?
int HP = 10;
return HP;
}
private void button_Click(object sender, RoutedEventArgs e)
{
initializeCombatship(); //won't let me just inherit goliath and HP
int L = goliath.LaserHit() - 5;
MessageBox.Show("Goliath hit by laser! You Ships HP = " + L + "");
}
答案 0 :(得分:4)
你正在调用一种方法:
initializeCombatship();
但该方法做什么?它在内部创建一个对象,但随后不对该对象做任何事情。因此,在方法完成并且消失之后,对象超出范围。所有方法都返回一个整数。你不使用。
然后尝试使用不存在的对象:
goliath.LaserHit()
当前方法中没有任何地方存在名为goliath
的对象,因此出现错误。
一个选项可能是从方法中返回对象:
public CombatShip initializeCombatship()
{
CombatShip goliath = new CombatShip(); //How do you make this public and not have to type this over and over?
goliath.HP = 10;
return goliath;
}
然后将返回的对象保存在变量中:
CombatShip goliath = initializeCombatship();
然后,在下一行,变量goliath
将存在并且具有该方法返回的对象的实例。
这开始看起来更像a "factory" method,由于各种原因,它经常被用来代替构造函数,具体取决于系统的需要。
答案 1 :(得分:1)
根据David的建议,你的方法可能是:
public CombatShip initializeCombatship()
{
return new CombatShip { HP = 10 };
}
不需要变量来保存要返回的对象。
答案 2 :(得分:1)
另一种方法是使用Lazy Initialization模式:
CombatShip _goliath = null;
CombatShip Goliath
{
get
{
if (_goliath == null)
{
_goliath = new CombatShip();
_goliath.HP = 10;
// or: _goliath = new CombatShip() { HP = 10 };
}
return _goliath;
}
set
{
_goliath = value;
}
}
现在,只要您引用Goliath
属性,它就会创建CombatShip
实例,如果它还没有这样做的话。如果要关闭当前实例,只需将null
分配给Goliath
属性。
只要适当地管理对象的生命周期,延迟初始化就很有用。它可以用来分散用大量包含的对象初始化类的成本,特别是在类的生命期间可能需要或可能不需要的那些对象中。在某些情况下也可以作为捷径使用。但它确实带来了轻微的开销 - 对get方法的调用并不是免费的。