9

我对为什么我能够在抽象类中使用“this”感到有些困惑。

我正在制作一个非常简单的面向对象的角色扮演游戏。我有一个名为Items. 然后我有两种类型的项目,可装备的和不可装备的。

interface IEquiptable
{
    void equiptItem(Player p);
    void unequiptItem(Player p);
}

有可装备物品的界面。

接下来,我有一个名为的抽象类Weapons

abstract class Weapons : Items, IEquiptable 
{
    public double powerOfWeapon { get; set; }
    public double powerNeededToUse { get; set; }


    public void equiptItem(Player p)
    {
        Console.WriteLine(this); 
        p.weapon = this;
    }

    public void unequiptItem(Player p)
    {
        //UNTESTED METHOD
        p.weapon = new Swords("Fists", 1, 1);
    }

}

这扩展了的基类Items(这个类目前只包含项目的名称,所以不值得展示)并实现接口'IEquiptable'。

最后我有一堂课叫Swords

class Swords : Weapons
{

    public Swords(string name, double powerOfS, double powerToU)
    {
        base.name = name;
        powerOfWeapon = powerOfS;
        powerNeededToUse = powerToU;
    }

}

这扩展了 Weapons 并为剑提供了一个构造函数。

这是我的一些Player

class Player
{
    public string Name { get; set; }
    public double life { get; set; }
    public double power { get; set; }
    public Weapons weapon { get; set; } // Currently held weapon

    private List<Items> items; //This is being used to represent a 'backpack' any item obtained will be added here.

为了装备武器,我使用这种方法:(在我的玩家类中)

public void equiptWeapon()
    {
        Weapons tempWep = items.OfType<Weapons>().FirstOrDefault();
        if (tempWep != null)
        {
            tempWep.equiptItem(this);        
        } 
    }

我不明白为什么会这样。tempWep 被赋予列表中第一个 Weapon 的值。但是随后它调用了equiptItem()由抽象类实现的方法,然后分配了“this”,我无法理解它是如何不因未初始化而引发错误的Weapons

希望你能明白我的意思。

谢谢。

4

2 回答 2

6

语言限制意味着您不能直接创建抽象类,但是完全有可能拥有它的实例 - 您只需创建派生类的实例,然后将其转换为抽象类。抽象类中也可以有实现,因此关键字的使用this是完全正常且可以接受的。

于 2013-05-26T03:40:29.540 回答
0

看看这个Microsoft on Abstract Keyword。它应该像那样工作。仅仅因为对象本身不能被实例化并不意味着它永远不会被实例化。事实上,在您可能到达代码中的关键字之前,您保证有一个实现类。this因此它是安全的。(当您WeaponItem列表中请求 a 时,它Weapon必须已经在您的代码中实例化。大概是 aSwords或类似的。否则您永远无法访问它以将其存储在列表中等等)

最后,我会注意到您使用Weapon该类的方式可能会有些混乱。所以一个简短的类比。这样想吧。仅仅因为挥动武器的想法,如果没有真正的武器在手,这意味着什么,并不意味着如果你手里拿着武器;它已经不能指代那把武器了。

希望现在更清楚一点。

于 2013-05-26T03:31:57.697 回答