Ahoj,
mam tridu Enemy, ktera je vychozim typem pro tridy protihracu. Ta by mela obsahovat metody setimage a draw, ktere by mely byt abstraktni (Enemy je vytvorena pouze pro ucely polymorfismu, sama by dokonce nemela ani obsahovat objekt Bitmap).
Ze tridy Enemy odvodim jednotlive typy protihracu, rekneme tridy Ghost, Specter atp. Kazda z techto dcerinych trid by mela obsahovat <b>staticky</b> objekt typu Bitmap a mela by prekryvat metody setimage a draw.
Zamer je samozrejme takovy, ze si v programu vytvorim pole objektu Enemy a budu je iterativne prochazet a volat draw jednotlivych nepratel. Objekt typu Bitmap bude stejny pro vsechny instance jednotlivych potomku tridy Enemy.
Problem je, ze mi Visual studio nechce dovolit vytvorit abstraktni statickou metodu (setimage). Jak jej nejlepe vyresit?
Diky moc, Dusan
Fórum › .NET
Abstraktni staticka metoda
Staticka metoda v abstractni tride nemuze byt, ale melo by to jit pridefinovat v odvozene tride.
static object obj // moze byt vsade
static abstract object obj // nemoze byt
Ale mozes pouzit:
abstract class Enemy
{
protected /* alebo public */ Image img;
public void Draw()...
}
sealed class Soldier // nemusi byt sealed
{
static Image img = ??;
public Soldier()
{
this.img = img;
}
}
sealed class Tank // nemusi byt sealed
{
static Image img = ??;
public Tank()
{
this.img = img;
}
}
Takto to riesim ja, ale ja nemam image, ale Texture a Draw() mi nakresli napr. stvorec na obj.Pos, velkosti obj.Size s texturou obj.img
Edit: mohol by si to mat ako Enemy: GameObject_Rectangle // ten by uz obsahoval draw na obdlznik,
A trochu si tomu static asi nepochopil
kdyz potom doplnim telo metody Draw do tridy Enemy:
Draw(Graphics gr) { gr.DrawImage(img, 150, 150); }
a napisu nasledujici kod:
Enemy soldier = new Soldier();
soldier.draw(gr);,
vykresli se Enemy.image nebo Soldier.image? Myslim ze by se mel vykreslit Enemy.image (coz je presne to, co nechci), protoze ten novy staticky obrazek by nemel prekryt ten stary nestaticky.
Problem uz jsem mezitim vyresil, vice mene podobne, ale s tim rozdilem, ze ja tam opravdu potrebuju ten obrazek staticky ...
Kazdopadne diky, Dusan
Neries to staticky, je to hlupost. Urob si triedu napr. TextureManager, ktora bude mat indexer (so stringom) a bude vracat Bitmap, ktory budes kreslit klasicky cez Graphics.
class TextureManager
{
Dictionary<string, Bitmap> textures = new Dictionary<string, Bitmap>();
public Bitmap this[string texture]
{
get { return textures[texture]; }
set
{
if (textures.ContainsKey(texture) == false)
textures.Add(texture, value);
else
textures[texture] = value;
}
}
}
Pripadne si z toho este urob singleton.
napisu nasledujici kod:
Enemy soldier = new Soldier();
soldier.draw(gr);,
vykresli se Enemy.image nebo Soldier.image? Myslim ze by se mel vykreslit Enemy.image (coz je presne to, co nechci)
nevykresli lebo sa utvori novy obj z Triedy Soldier, ale ak by mal soldier nejake funkcie naviac, napr. Fire(), tak by si to mohol urobit
(soldier as Soldier).Fire(); // alebo
((Soldier)soldier).Fire(); // neviem aky je rozdiel
Edit: A image je struct alebo class, lebo ak struct tak ti to bude vzdy kopirovat pokial nepouzijes ukazatel,
cize vytvoris 1000 objektov cize 1000x image, cize zapraskas dost ram
mnn napsal: Ak by si vsak pouzil (Soldier)s tak by ti to vyhodilo vynimku (ak by objekt nebol Soldier)
A ak by pri " as " nebol objekt Soldier??
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Staticka metoda — založil jonhnw
Interface - statická metoda — založil Miloš
Objektové programování - statická metoda — založil CrazyWolf
Třída, konstruktor, statická metoda — založil diabolus99
OOP - Statická metoda a vnitřní public call — založil Blah
Moderátoři diskuze