2013-05-26 3 views
7

Я немного смущен, почему я могу использовать «это» в абстрактных классах.Ключевое слово '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

Надеюсь, вы можете понять, что я имею в виду.

Спасибо.

+1

Оружие не оснащается. «Лицо» должно иметь метод «Equip». Независимо от этого, абстрактный класс, хотя вы не можете его создать напрямую, все же представляет собой объект - следовательно, это «это». – SimpleVar

+0

Просто, чтобы уточнить, что вы здесь делаете, говорит человеку, чтобы экипировать оружие, и человек делает это, указывая оружию, чтобы экипировать себя на этом человеке, а затем оружие фактически экипирует себя на человека. Это PingPong #. – SimpleVar

+1

Возможно, это поможет. Мысленно представьте, что каждый метод, который использует «это», теперь является * статическим * методом. Теперь добавьте формальный параметр к этому методу, называемому '_this'. Ментально замените каждое 'this' на' _this'. Для свойств, представьте, что они являются статическими методами 'static int get_Color (Shape _this) {return _this.color; } 'и аналогично для сеттеров. В мире, где каждый метод статичен, и никто не использует «это», есть ли у вас какие-либо возражения? Потому что * это в основном, как это работает *. 'this' - это просто соглашение о наличии скрытого формального параметра. –

ответ

5

Языковые ограничения означают, что вы не можете создать абстрактный класс напрямую, однако вполне возможно иметь его экземпляр - вы просто создаете экземпляр производного класса и затем передаете его абстрактному классу.Абстрактный класс также может иметь реализацию в нем, поэтому использование ключевого слова this совершенно нормально и приемлемо.

0

Посмотрите на это Microsoft on Abstract Keyword. Он должен работать так. Просто потому, что сам объект не может быть создан, не означает, что он никогда не будет создан. На самом деле ваш гарантирует, чтобы иметь класс реализации, прежде чем вы сможете достичь ключевого слова this в своем коде. Таким образом, это безопасно. (При запросе Weapon из вашего Item списка, что Weapon пришлось уже конкретизируется в вашем коде. Предположительно, к Swords или тому подобное. В противном случае вы никогда не могли получить доступ к нему, чтобы сохранить его в списке и так далее)

Наконец, я буду замечать, что способ использования класса Weapon может быть немного запутанным. Итак, короткая аналогия в точке. Подумайте об этом таким образом. Просто потому, что мысль, качающая оружие, ничего не означает без реального оружия в руке, не означает, что если вы держите оружие в руке; он не может ссылаться на это оружие.

Надеюсь, теперь это немного яснее.

Смежные вопросы