C# ';这';抽象类中的关键字
我对为什么能够在抽象类中使用“this”有点困惑 我正在制作一个非常简单的面向对象角色扮演游戏。我有一个名为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 {
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);
}
}