Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ';这';抽象类中的关键字_C#_This_Abstract Class - Fatal编程技术网

C# ';这';抽象类中的关键字

C# ';这';抽象类中的关键字,c#,this,abstract-class,C#,This,Abstract Class,我对为什么能够在抽象类中使用“this”有点困惑 我正在制作一个非常简单的面向对象角色扮演游戏。我有一个名为Items的基类/超类。然后我有两种类型的项目,装备和非装备 interface IEquiptable { void equiptItem(Player p); void unequiptItem(Player p); } 这是装备项目的界面 接下来,我有一个名为武器的抽象类: abstract class Weapons : Items, IEquiptable {

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

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

interface IEquiptable
{
    void equiptItem(Player p);
    void unequiptItem(Player p);
}
这是装备项目的界面

接下来,我有一个名为武器的抽象类:

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);
    }

}
这扩展了
项的基类
(该类目前只包含项的名称,因此不值得显示),并实现了接口“IEquiptable”

最后,我有一个名为
swarks

class Swords : Weapons
{

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

}
这扩展了武器并为剑提供了一个构造器

这是我的一些
播放器
课程

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.
职业玩家
{
公共字符串名称{get;set;}
公共双寿命{get;set;}
公共双幂{get;set;}
公共武器武器{get;set;}//当前持有的武器
私有列表项目;//这用于表示“背包”,获得的任何项目都将添加到此处。
为了装备武器,我使用以下方法:(在我的玩家类中)

public void equipmtweapon()
{
武器tempWep=items.OfType().FirstOrDefault();
if(tempWep!=null)
{
临时设备(本);
} 
}
我不明白为什么会这样。tempWep被赋予了列表中第一个武器的值。但随后它调用了方法
equititem()
由抽象类在中实现,然后分配“this”,我无法理解它如何不会因为没有初始化
武器而抛出错误

希望你能理解我的意思

谢谢。

看看这个。 它就是这样工作的。仅仅因为对象本身不能被实例化并不意味着它永远不会被实例化。事实上,你的保证在你可能到达代码中的
this
关键字之前有一个实现类。因此它是安全的。(当你从你的
物品
列表中请求
武器
时,该
武器
必须已经在你的代码中实例化。可能是一把
或类似的东西。否则你永远无法访问它以将其存储在列表中,依此类推)

最后,我会注意到,你使用武器类的方式可能会有点混乱。因此,在这一点上进行一个简短的类比。这样想吧。仅仅因为挥动武器的想法,如果没有一件真正的武器在手,就没有任何意义,并不意味着如果你手里拿着武器,它就不能指那件武器


希望现在更清楚一点。

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

武器不装备自己。人应该有
装备
方法。不管怎样,一个抽象类,尽管你不能直接实例化它,但它毕竟代表一个对象-因此
这个
。只是澄清一下-你在这里所做的是告诉我们他让人装备一件武器,这个人告诉武器装备在这个人身上,然后武器装备在这个人身上。这就是乒乓球。也许这会有帮助。想象一下每一种使用“这个”的方法现在是一个静态方法。现在为该方法添加一个名为
\u this
的形式参数。将每个
this
替换为
\u this
。对于属性,假设它们是静态方法
static int get\u Color(Shape _this){return this.Color;}
对于setter也是如此。在一个每个方法都是静态的,没有人使用
这个
的世界里,你有什么异议吗?因为它基本上就是这样工作的。
这个
只是一个惯例,即存在一个隐藏的形式参数。
public void equiptWeapon()
    {
        Weapons tempWep = items.OfType<Weapons>().FirstOrDefault();
        if (tempWep != null)
        {
            tempWep.equiptItem(this);        
        } 
    }