Abstraktni staticka metoda – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Abstraktni staticka metoda – .NET – Fórum – Programujte.comAbstraktni staticka metoda – .NET – Fórum – Programujte.com

 

Dusan R.
~ Anonymní uživatel
6 příspěvků
14. 7. 2009   #1
-
0
-

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

Nahlásit jako SPAM
IP: 217.197.149.–
dannyk0
Věrný člen
14. 7. 2009   #2
-
0
-

Staticka metoda v abstractni tride nemuze byt, ale melo by to jit pridefinovat v odvozene tride.

Nahlásit jako SPAM
IP: 85.135.97.–
Jedu v c++,c#,assembler,ASP.NET,PHP,databaze,bezpecnost softwaru[br] -----------------------------------------------------------[br] Muj blog o programovani,hudbe a vsem moznem,co najdu na netu :) [br] http://dannyk.aspone.cz[br] -----------------------------------------------------------[br] Na foru mam nejake prispevky pod nickem Master,tak jen pro upresneni :)
Miro17010
Stálý člen
14. 7. 2009   #3
-
0
-

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

Nahlásit jako SPAM
IP: 85.159.104.–
začinajúci programátor v .Net: C# & OpenTK: OpenGL( pouzivam ), OpenAL( zatial nepouzivam ), OpenCL( este som neskusal )
Dusan R.
~ Anonymní uživatel
6 příspěvků
14. 7. 2009   #4
-
0
-

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

Nahlásit jako SPAM
IP: 217.197.149.–
mnn
~ Anonymní uživatel
118 příspěvků
14. 7. 2009   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 91.127.228.–
Miro17010
Stálý člen
14. 7. 2009   #6
-
0
-

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

Nahlásit jako SPAM
IP: 85.159.104.–
začinajúci programátor v .Net: C# & OpenTK: OpenGL( pouzivam ), OpenAL( zatial nepouzivam ), OpenCL( este som neskusal )
mnn
~ Anonymní uživatel
118 příspěvků
14. 7. 2009   #7
-
0
-

Miro1701:
as operator sa pouziva takto:

Soldier s = soldier as Soldier;

if (s != null)
{
...
}

Ak by si vsak pouzil (Soldier)s tak by ti to vyhodilo vynimku (ak by objekt nebol Soldier)

Nahlásit jako SPAM
IP: 91.127.228.–
mnn
~ Anonymní uživatel
118 příspěvků
14. 7. 2009   #8
-
0
-

A co sa tyka Bitmap tak to je trieda a ta sa ti nebude kopirovat aj ked je v strukture (kopiruje sa iba trieda).

Nahlásit jako SPAM
IP: 91.127.228.–
Miro17010
Stálý člen
14. 7. 2009   #9
-
0
-

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??

Nahlásit jako SPAM
IP: 85.159.104.–
začinajúci programátor v .Net: C# & OpenTK: OpenGL( pouzivam ), OpenAL( zatial nepouzivam ), OpenCL( este som neskusal )
mnn
~ Anonymní uživatel
118 příspěvků
14. 7. 2009   #10
-
0
-

nevyhodilo by to vynimku len by to vratilo null, ktory sa da jednoduchsie (a hlavne rychlejsie) skontrolovat ako vynimka (cez try-catch).

Nahlásit jako SPAM
IP: 91.127.228.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Staticka metoda — založil jonhnw

Interface - statická metoda — založil Miloš

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý