2013-05-26 21 views
7

Jestem lekko zdezorientowany, dlaczego mogę używać "tego" w klasach abstrakcyjnych.Słowo kluczowe "to" w klasach abstrakcyjnych

Tworzę bardzo prostą, zorientowaną obiektowo grę fabularną. Mam bazę/super klasy o nazwie Items. Mam wtedy dwa rodzaje przedmiotów, które można wyposażyć i nie można ich wyposażyć.

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

Interfejs do przedmiotów wyposażonych w sprzęt.

Następny mam klasa abstrakcyjna nazywany 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); 
    } 

} 

ta rozszerza klasę bazową Items (klasa ta zawiera tylko nazwę dla pozycji w tej chwili, więc nie warto pokazać) i wdraża interfejs "IEquipable".

Wreszcie mam klasy o nazwie Swords

class Swords : Weapons 
{ 

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

} 

Wydłuża Broń i zapewnia konstruktor miecza.

Oto niektóre z moich Player klasy

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. 

Aby eqipt broń używam tej metody: (w mojej klasie gracza)

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

ja nie rozumiem, dlaczego to działa. tempWep otrzymuje wartość pierwszej broni na liście. Ale to jest wywołanie metody equiptItem() który jest realizowany przez klasy abstrakcyjnej, a następnie „to” jest przypisane, których nie można śledzić, jak nie rzucać się błąd za nie jest zainicjować Weapons

Mam nadzieję, że można rozumiesz co mam na myśli.

Dzięki.

+1

Broń się nie uzbraja. "Osoba" powinna mieć metodę "Equip". Niezależnie od tego, klasa abstrakcyjna, chociaż nie można jej bezpośrednio utworzyć, mimo wszystko reprezentuje obiekt - stąd "to". – SimpleVar

+0

Tylko po to, by wyjaśnić - to, co tu robisz, mówi osobie, by wyposażyła broń, a osoba robi to, mówiąc broń, by wyposażyła się w tę osobę, a następnie broń faktycznie się uzbraja w tę osobę. To jest PingPong #. – SimpleVar

+1

Może to pomoże. Mentalnie wyobraź sobie, że każda metoda, która używa "tego", jest teraz metodą * statyczną *. Teraz dodaj formalny parametr do tej metody o nazwie "_this". Mentalnie zamień każdy "ten" na "_this". Dla właściwości, wyobraź sobie, że są to statyczne metody 'static int get_Color (Shape _this) {return _this.color; } 'i podobnie dla seterów. W świecie, w którym każda metoda jest statyczna i nikt nie używa "tego", czy masz jakieś zastrzeżenia? Ponieważ * w zasadzie to działa *. "to" to tylko konwencja, że ​​istnieje ukryty parametr formalny. –

Odpowiedz

5

Ograniczenia językowe oznaczają, że nie można bezpośrednio utworzyć klasy abstrakcyjnej, jednak możliwe jest jej wystąpienie - wystarczy utworzyć instancję klasy pochodnej, a następnie przenieść ją do klasy abstrakcyjnej.Klasa abstrakcyjna może również zawierać w sobie implementację, więc użycie słowa kluczowego this jest całkowicie normalne i dopuszczalne.

0

Proszę spojrzeć na to Microsoft on Abstract Keyword. To ma działać tak. Tylko dlatego, że sam obiekt nie może być utworzony, nie oznacza, że ​​nigdy nie zostanie utworzony. W rzeczywistości Twój zagwarantował posiadanie klasy implementacji, zanim możliwe będzie osiągnięcie słowa kluczowego this w kodzie. Dlatego jest bezpieczny. (Kiedy zażądać Weapon z listy Item, że Weapon musiała już instancja w kodzie. Przypuszczalnie do Swords lub tym podobne. W przeciwnym razie nigdy nie można uzyskać do niego dostęp, aby zapisać go na liście i tak dalej)

W końcu zauważę, że sposób, w jaki używasz klasy Weapon może być nieco mylący. Tak więc krótka analogia. Pomyśl o tym w ten sposób. Tylko dlatego, że myśl, machnięcie bronią, nic nie znaczy bez rzeczywistej broni w ręku, nie oznacza, że ​​jeśli trzymasz broń w ręku; nie może odnosić się do tej broni.

Mam nadzieję, że teraz jest trochę jaśniej.