2013-05-26 2 views
7

추상 클래스에서 'this'를 사용할 수있는 이유에 대해 약간 혼란 스럽습니다.추상 클래스의 'this'키워드

나는 아주 아주 간단한 객체 지향적 인 역할 놀이 게임을 만들고있다. base/super class는 Items입니다. 나는 equiptable과 non-equiptable의 두 가지 유형의 아이템을 가지고있다.

interface IEquiptable 
{ 
    void equiptItem(Player p); 
    void unequiptItem(Player p); 
} 

해당 항목에 대한 인터페이스입니다. 이것은 (쇼 그렇게 가치가이 클래스는 순간에있는 항목의 이름을 포함) Items의 기본 클래스를 확장

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

} 

및 구현 :

다음, 나는 추상 클래스는 Weapons라는이 인터페이스 'IEquiptable'.

마지막으로 나는 Swords

class Swords : Weapons 
{ 

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

} 

이 무기 확장하고 칼의 생성자를 제공라는 클래스가 있습니다. 이 작품 왜 이해가 안

public void equiptWeapon() 
    { 
     Weapons tempWep = items.OfType<Weapons>().FirstOrDefault(); 
     if (tempWep != null) 
     { 
      tempWep.equiptItem(this);   
     } 
    } 

(내 플레이어 클래스) :

은 여기 내 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이다. tempWep에 목록의 첫 번째 무기 값이 제공됩니다. 하지만 그때 그것은 추상적 인 클래스에 의해 구현되고있는 equiptItem() 메서드를 호출하고 나서 'this'가 할당되는 중입니다. 초기화되지 않는 오류를 던지지 않는 방법을 따를 수 없습니다. Weapons

내가 무슨 뜻인지 이해해.

감사합니다.

+1

무기에는 장비가 장착되어 있지 않습니다. 'Person'은'Equip' 메소드를 가져야합니다. 그것과 관계없이 추상 클래스는 결국 직접 인스턴스화 할 수는 없지만 결국 객체를 나타냅니다. 따라서 '이'입니다. – SimpleVar

+0

당신이 여기서하고있는 일은 무기를 장비하라는 것을 말하는 것이며, 무기를 장비에 설치하여 그 사람이 그 장비에 장비를 갖도록 지시하면 무기는 실제로 사람에게 장비됩니다. 그건 핑퐁이야. – SimpleVar

+1

아마도 도움이 될 것입니다. 정신적으로 "this"를 사용하는 모든 메서드가 이제 * 정적 * 메서드라고 상상해보십시오. 이제'_this'라는 메소드에 형식 매개 변수를 추가하십시오. 정신적으로 모든 '이'를'_ '로 대체하십시오. 속성의 경우 정적 메서드라고 가정합니다. static int get_Color (Shape _this) {return _this.color; }'및 setter에 대해서도 마찬가지입니다. 모든 방법이 정적이고 아무도 '이'를 사용하지 않는 세상에서 이의가 있습니까? * 기본적으로 어떻게 작동하는지 * 때문입니다. 'this'는 숨겨진 형식 매개 변수가 있다는 규칙 일뿐입니다. –

답변

5

언어 제약 조건을 사용하면 추상 클래스를 직접 만들 수는 없지만 인스턴스를 가질 수는 있습니다. 파생 클래스 인스턴스를 만든 다음 추상 클래스로 캐스트하면됩니다.추상 클래스도 구현할 수 있으므로 키워드 this의 사용은 완벽하게 정상이며 받아 들일 수 있습니다.

0

Microsoft on Abstract Keyword을보세요. 그런 식으로 작동하도록되어 있습니다. 객체 자체를 인스턴스화 할 수 없기 때문에 인스턴스화되지 않습니다. 실제로 에 구현 클래스가 있음을 보장하기 전에 코드의 키워드에 도달 할 수 있습니다. 따라서 그것은 안전합니다. (당신이 당신의 Item 목록에서 Weapon을 요청하면 Weapon 이미도 아마 Swords 등으로. 코드에서 인스턴스화 된 것으로했다고. 그렇지 않으면 당신이 그렇게의 목록에 저장하고 액세스 할 수 없었습니다)

마지막으로 나는 Weapon 클래스를 사용하는 방법이 다소 혼란 스러울 수 있음을 알게 될 것입니다. 에 대한 짧은 비유. 이런 식으로 생각하십시오. 무기를 휘두르는 생각이 손에 실제 무기가 없다는 것을 의미하기 때문에, 무기를 손에 들고 있다면 그것을 의미하지는 않습니다. 그 무기를 가리킬 수는 없습니다.

이제 조금 더 명확 해지기를 바랍니다.