简单地重用一种方法来减少代码错误

时间:2016-03-25 13:41:38

标签: c# inheritance methods

所以我想知道如何在这里保存代码。我想使用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 + "");
}

3 个答案:

答案 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方法的调用并不是免费的。