抽象类中的'this'关键字

时间:2013-05-26 03:09:04

标签: c# this abstract-class

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

我正在制作一个非常简单的面向对象的角色扮演游戏。我有一个名为Items的基础/超级课程。然后我有两种类型的物品,可装备的和不可装备的。

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

Theres可装备物品的界面。

接下来,我有一个名为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;
    }

}

这扩展了武器并为剑提供了构造函数。

以下是我的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被赋予列表中第一个武器的值。但是它正在调用方法equiptItem(),它正在被抽象类实现,然后'this'被分配,我无法遵循它如何不抛出错误而不是初始化{{1} }

希望你能理解我的意思。

感谢。

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

最后我会注意到你使用Weapon类的方式可能会有些混乱。所以在一点上做一个简短的比喻。这样想吧。只是因为思想,挥动武器,没有手中的实际武器就没有任何意义,并不意味着如果你手持武器;它不能指那种武器。

希望现在有点清楚。