Jak użyć metody obiektu będącego w liście?

0

Otóż, mam taki problem. Robię grę na projekt z programowania obiektowego. Postanowiłem zrobić ją w windows forms. I teraz mam walkę i chodzi o to, że mam listę klasy Hero po której dziedziczą po kolei Warrio, Mage, Priest i Archer. No i w tej liście są bohaterowie których wybrali gracze. Otóż gdy jest wybrany konkretny bohater np Warrior, który ma umiejętność sword hit i mam wtedy:
if(AllyTeam[currentHero] is Warrior)//to dziala to wczesniej juz testowalem
{
AllyTeam[currentHero].swordHit();// i tutaj pokazuje mi błąd
}

błąd polega na tym, że mówi, że musi być to statyczne, ale nie może bo w tej metodzie używam pól które nie są statyczne i też mi błąd wyrzuca.
0

Już nie istotne, znalazłem rozwiązanie, bo sprawdziłęm jak to zrobiłęm wcześniej w wersji konsolowej. Więc temat zamknięty

1

No i w tej liście są bohaterowie których wybrali gracze. Otóż gdy jest wybrany konkretny bohater np Warrior, który ma umiejętność sword hit i mam wtedy

Za dużo wspólnego z programowaniem obiektowym to nie ma...

Powinieneś mieć interfejs albo klasę bazową z metodą Attack, a poszczególne podklasy by sobie ją implementowały w odpowiedni dla siebie sposób i nie musiałbyś mieć wtedy tego sprawdzania typu obiektu za pomocą is.

0

No tak, ale z interfejsem nie przejdzie, ponieważ każda klasa ma inne ataki, umiejętności. A rozwiązałem to w taki sposób, że wcześniej na konsolowej wersji miałem przy wyborze ataku sprawdzenie jeśli obecnie wybrany bohater jest klasy Warrior, to przechodził do metody która jako parametr przyjmowała obiekt klasy Warrior, przy wywołaniu metody rzutowałem obecnego bohatera na typ Warrior(czyli warrior_attack((Warrior)hero);)
I tak samo tutaj zrobiłem.

0

No tak, ale z interfejsem nie przejdzie, ponieważ każda klasa ma inne ataki

No to chyba na tym polegaja interfejsy?

1

Czyli złamałeś zasadę podstawienia Liskov :-P
To nie jest rozwiązanie problemu, tylko jego obejście - i fakt, z OO nie ma za wiele wspólnego.

0
Patryk27 napisał(a):

Czyli złamałeś zasadę podstawienia Liskov :-P
To nie jest rozwiązanie problemu, tylko jego obejście - i fakt, z OO nie ma za wiele wspólnego.

niestety C# 7 zachęca do gwałcenia tej zasady, w VS 2017 można teraz napisać:

switch (AllyTeam[currentHero])
{
    case Warrior warrior:
        warrior.swordHit();
        break;
}
0
Krzywy Lew napisał(a):

niestety C# 7 zachęca do gwałcenia tej zasady, w VS 2017 można teraz napisać:

switch (AllyTeam[currentHero])
{
    case Warrior warrior:
        warrior.swordHit();
        break;
}

W jaki niby sposób kod napisany w innym paradygmacie może gwałcić zasady OOP?

1 użytkowników online, w tym zalogowanych: 0, gości: 1