Я немного смущен, почему я могу использовать «это» в абстрактных классах.Ключевое слово 'this' в абстрактных классах
Я делаю очень простую объектно-ориентированную ролевую игру. У меня есть класс base/super, который называется 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.
Чтобы eqipt оружие, я использую этот метод: (в моем классе игрока)
public void equiptWeapon()
{
Weapons tempWep = items.OfType<Weapons>().FirstOrDefault();
if (tempWep != null)
{
tempWep.equiptItem(this);
}
}
Я не понимаю, почему это работает. tempWep получает значение первого Оружия в списке. Но тогда это вызов метода equiptItem()
который реализуется в абстрактной классе, а затем «это» в настоящее время назначается, который я не могу проследить, как он не выдаст ошибку за не инициализировать Weapons
Надеюсь, вы можете понять, что я имею в виду.
Спасибо.
Оружие не оснащается. «Лицо» должно иметь метод «Equip». Независимо от этого, абстрактный класс, хотя вы не можете его создать напрямую, все же представляет собой объект - следовательно, это «это». – SimpleVar
Просто, чтобы уточнить, что вы здесь делаете, говорит человеку, чтобы экипировать оружие, и человек делает это, указывая оружию, чтобы экипировать себя на этом человеке, а затем оружие фактически экипирует себя на человека. Это PingPong #. – SimpleVar
Возможно, это поможет. Мысленно представьте, что каждый метод, который использует «это», теперь является * статическим * методом. Теперь добавьте формальный параметр к этому методу, называемому '_this'. Ментально замените каждое 'this' на' _this'. Для свойств, представьте, что они являются статическими методами 'static int get_Color (Shape _this) {return _this.color; } 'и аналогично для сеттеров. В мире, где каждый метод статичен, и никто не использует «это», есть ли у вас какие-либо возражения? Потому что * это в основном, как это работает *. 'this' - это просто соглашение о наличии скрытого формального параметра. –