2013-05-26 18 views
7

なぜ抽象クラスで 'this'を使用できるのか、私は少し混乱しています。抽象クラスの 'this'キーワード

私は非常に単純なオブジェクト指向のロールプレイングゲームを作っています。私はItemsと呼ばれるベース/スーパークラスを持っています。私は、次に、2つのタイプのアイテムを持っています。

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

テキスタイルアイテムのインターフェイスです。

次に、私は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; 
    } 

} 

と呼ばれるクラスは、これは武器を拡張し、剣のコンストラクタを提供しています。この作品、なぜ私は理解していない

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するためです。リスト内の最初のWeaponの値がtempWepに与えられています。しかし、抽象クラスで実装されているメソッドequiptItem()を呼び出すと、 'this'が割り当てられています。初期化されていないためにエラーが発生しないようにします。Weapons

私が何を意味するのか理解する。

ありがとうございました。

+1

武器は装備していません。 'Person'には' Equip'メソッドが必要です。それにかかわらず、抽象クラスは、それを直接インスタンス化することはできませんが、結局オブジェクトを表します。したがって、「this」です。 – SimpleVar

+0

あなたがここでやっていることは、武器を装備するように兵士に指示することです。武器にその武器を装備するように指示することによって武器を装備すると、武器は実際に人間に備わっています。それはピンポンです。 – SimpleVar

+1

おそらくこれが役に立ちます。精神的に "this"を使用するすべてのメソッドが* static *メソッドであると想像してください。そのメソッドに '_this'という仮パラメータを追加します。精神的に 'すべて 'これを' _'で置き換えてください。プロパティについては、静的メソッドであると仮定します。static int get_Color(Shape _this){return _this.color; } 'と同様にセッターのために。すべての方法が静的で誰も「this」を使用しない世界では、異論はありますか? *それは基本的にどのように動作するのか*。 'this'は秘密の仮引数があるという慣例に過ぎません。 –

答えて

5

言語の制約は、抽象クラスを直接作成することはできませんが、インスタンスを作成することは可能です。単に、派生クラスのインスタンスを作成して抽象クラスにキャストするだけです。抽象クラスにも実装があるため、キーワードthisの使用は完全に正常で許容されます。

0

このMicrosoft on Abstract Keywordをご覧ください。 それはそのように動作することを意味します。ちょうどオブジェクト自体がインスタンス化されないのでインスタンス化されることはありません。実際にはに実装クラスがあることを保証してから、コード内でというキーワードに到達する可能性があります。したがって、安全です。 (あなたは、あなたのItemリストからWeaponを要求するとWeaponは、すでにおそらくSwordsなどに。あなたのコードでインスタンス化されていなければならなかったこと。そうしないとあなたがそうのリストにそれを格納するためにそれにアクセスすることができませんでした)

最後に、Weaponクラスの使用方法が少し混乱する可能性があることに注意してください。オン・ポイントでの短いアナロジー。このように考えてみてください。あなたの武器を手にしているならば、実際に武器を手に入れなければ、武器を振りかけるという思想が、何も意味しないからです。その武器を参照することはできません。

今はもう少し明確です。