我对为什么能够在抽象类中使用'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} }
希望你能理解我的意思。
感谢。
答案 0 :(得分:5)
语言约束意味着您不能直接创建抽象类,但是完全可以拥有它的实例 - 您只需创建派生类的实例,然后将其转换为抽象类。抽象类也可以在其中实现,因此关键字this
的使用是完全正常且可接受的。
答案 1 :(得分:0)
看看这个Microsoft on Abstract Keyword。
这意味着像那样工作。仅仅因为对象本身无法实例化并不意味着它永远不会被实例化。事实上,您的保证有一个实施类,然后才能在代码中找到this
关键字。因此它是安全的。 (当您从Weapon
列表中请求Item
时,Weapon
必须已在您的代码中进行实例化。大概是Swords
之类的。否则您可以从不访问它以将其存储在列表中等等)
最后我会注意到你使用Weapon
类的方式可能会有些混乱。所以在一点上做一个简短的比喻。这样想吧。只是因为思想,挥动武器,没有手中的实际武器就没有任何意义,并不意味着如果你手持武器;它不能指那种武器。
希望现在有点清楚。