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.
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
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
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. –