| Autor | Správa |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 | Zaslal: Po 09.08.10 15:33 |   |
Ahoj, veľa o triedach (TClass) neviem, možno je moja predstava o triedach nesprávna, ale pracujem na jednom projekte, ktorý vkuse pracuje s MySQL, v ktorej sú uložené informácie o používateľoch, zmluvách, faktúrach, produktoch, platbách atď.
Ide o to, že tam mám väčšie množstvo funkcií... sú funkcie pre:
Používateľov:
- vytvorenie používateľa
- vymazanie používateľa
- editáciu
Faktúry:
- vytvorenie faktúry
- tlač faktúry
atď.
Od tried očakávam, že mi v tomto spravia poriadok a funkcie (resp. metódy) mi zoskupia pod svoje krídlo, takže k nim budem môcť pristupovať napr. cez:
| kód: | User.Add('Jozef', 'Mocný'); // vytvori usera
Invoice.Create(17); // vytvori fakturu pre usera s idckom 17 |
Dá sa to? Je to vôbec možné? |
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 909
 | Zaslal: Po 09.08.10 16:12 |   |
Nielenže sa to dá, ale na to sú triedy určené. To je vlastne cieľ objektovo orientovaných jazykov - neprogramovať procedurálne, ale pomocou tried, teda objektovo.
Vytvoríš si triedu, ktorá bude mať konšruktor (deštruktor) a členské funkcie. Členské funkcie sú prístupné iba pre objekty danej triedy.
Ďalej môžeš využívať dedenie, tzn, že máš rodičovskú triedu, ktorá má spoločné časti pre používateľov aj pre faktúry a z nej potom vytvoríš ďalšie triedy s pridanými vlastnosťami od rodičosvskej.
Prečítaj si základy o OOP v delphi, aby si sa trocha do toho dostal a potom ak budeš mať nejaký konkrétny problém vo svojom programe, tak sa spýtaj. Pozri sa napríklad sem, ako vytvoriť triedu. |
| |
   |
 |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 | Zaslal: Pi 20.08.10 12:57 |   |
No buď to nefunguje ako chcem (málo pravdepodobné) alebo som blbý (takmer isté). V každom prípade, čo čítam je nutné vytovoriť objekt (instanciu) danej triedy. Mne ide však o to, aby som nič vytvárať nemusel a jednoducho len napísal:
Faktura.Vytvor('baf');
a funckia Vytvor triedy Faktura to urobí. Čiže ja od toho očakávam niečo na štýl zgrupených funkcií, lebo teoreticky by to šlo spraviť cez funkcie:
Faktura_Vytvor(bla bla);
Faktura_Edituj(nieco);
Ale ak to chápem správne, tak classy (triedy) umožňujú navyše vytvorenie prepojenia medzi metódami triedy. Čiže napr. si budú môcť zdieľať hodnoty premenných atď. Len furt neviem či to chápem dobre :/ |
| |
   |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Pi 20.08.10 13:31 |   |
asi myslis class metody tried , ale najprv si to poriadne nastuduj |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 909
 | Zaslal: Pi 20.08.10 13:41 |   |
V prvom rade si musíš uvedomiť, ako funguje trieda a ako s nimi pracovať. Pokúsim sa ti to vysvetliť na nejakom príklade:
Predstav si triedu auto. Táto trieda má určité prvky, vlastnosti, podľa ktorých ju dokážeme rozlíšiť, identifikovať ju, pracovať s ňou. Každé auto má napríklad štyri kolesá, volant, karosériu atď. To všetko daná trieda obsahuje. Z tejto triedy (auto) môžme vytvoriť inštancie, napríklad zelené auto, modré auto, atď. Všetky inštancie triedy auto majú všetky vlastnosti tejto triedy, ale pritom jedna inštancia nezasahuje do tej druhej. Tzn v tvojom prípade - môžeš si vytvoriť ľubovoľný počet inštancií na triedu Faktura, kde každá môže obsahovať iné dáta. Teraz vytvorenie triedy:
Ak chceš vytvoriť triedu, tak to musíš spraviť pomocou konštruktoru danej triedy, ktorý si môžeš sám napísať. V tvojom prípade do tohto konštruktoru môžeš vložiť celé telo funkcie Vytvor. Konštruktor vyzerá takto:
| kód: | constructor TFaktura.Vytvor( nieco: integer );
begin
// sem pride inicializacia a podobne
end; |
Potom si možeš vytvoriť trebárs dve faktúry:
| kód: | var
faktura1, faktura2: TFaktura;
begin
faktura1 := TFaktura.Vytvor( 100 );
faktura2 := TFaktura.Vytvor( 500 );
end; |
Prepojenie si mal na mysli zrejme niečo také, že faktura1 má nejaký údaj, ktorý chceš spracovať aj vo faktura2. Ak áno, to je samozrejme možné. Proste v tride TFaktura vytvoríš funkciu, ktorá bude brať ako parameter objekt triedy TFaktura. Napríklad:
| kód: | procedure TFaktura.ZdielajData( inaFaktura: TFaktura );
begin
meno := inaFaktura.meno;
end; |
Neviem, či som odpovedal na všetky otázky a či dostatočne výstižne, v každom prípade sa opýtaj, ak ešte niečo robí problém. |
| |
   |
 |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 | Zaslal: Po 23.08.10 13:44 |   |
Fico, díky za vyčerpávajúcu odpoveď, veľmi mi ujasnila situáciu Podľa všetkého teda vždy musím vytvoriť inštanciu, ak chcem využiť triedu, správne?
Predstavme si inú modelovú situáciu... máme tabuľku používateľov. Aj používateľa by sme mohli využiť ako triedu, nakoľko aj on má nejaké vlastnosti objektov na sebe nezávislé (meno, priezvisko, login, heslo, email).
S používateľom potrebujeme robiť nasledovné veci:
| kód: | TUser.Create(name, surname, login, pass, email: string);
TUser.Update(id: string; name, surname, login, pass, email: string);
TUser.Delete(id: string); |
Pracujeme s MySQL - po zavolaní funkcie TUser.Create(...); sa skontroluje či sme vyplnili údaje a či sa už používateľ v DB nenachádza. Ak je všetko OK, vytvoríme ho cez SQL INSERT a tým funkcia končí.
Obdobne sú na tom zvyšné dve funkcie, SQL UPDATE a SQL DELETE.
Je teda aj v tomto prípade nutné vytvárať inštancie? Alebo je možné len nejak zavolať:
| kód: | | TUser.Create('Jozef', 'Mocný', 'jozo_power', 'power_jozef', 'jozef@mocny.sk'); |
|
| |
   |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 909
 | Zaslal: Po 23.08.10 14:15 |   |
| Manny napísal: | | vždy musím vytvoriť inštanciu, ak chcem využiť triedu, správne? | Správne.
Neviem, či som pochopil správne otázku, tak sa teda spýtam: Potrebuješ vytvoriť inštanciu objektu TUser až po tom, čo si overiš, či sa už nachádzajú informácie o danom userovi v databáze? Ak áno, tak myslím, že je zbytočne na každého usera vytvárať triedu, keďže s userom ako takým sa nenarába, pracuje sa len s jeho údajmi v databáze. Vytvoril by som skôr len jednu triedu, napr TDatabaza, pomocou ktorej by si vytváral, menil a mazal dáta z danej databázy. Príklad:
| kód: | TDatabaza = class
private:
// tuna pridu clenske premenne, ktore budeš potrebovať pre danu triedu
public
constructor Create( nejaka_inicializacia: integer ); // vytvorenie triedy, inicializacia clenskych premennych, atd
destructor Destroy; override; // zrusenie triedy, sem sa zvykne davat uvolnovanie datovych typov, dealokacia pamate, atd
function existujeTentoUser( meno: string ): boolean; // funkcia vrati true ak existuje, inak false
procedure pridajUsera( meno: string ); // prida usera do databazy
procedure odstranUsera( meno: string ); // odstrani usera z databazy
// a tak podobne, podla toho, co potrebujes
end; |
Toto je iba malý príklad, ako som to mal na mysli. Proste bolo by zbytočné mať tam X inštancií na TUser, keď to nie je nutné (za predpokladu, že užívateľov iba pridávaš, edituješ a odoberáš z databázy). Keď som ale zle pochopil otázke, tak ma oprav. |
| |
   |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Po 23.08.10 18:34 |   |
| Manny napísal: | Fico, díky za vyčerpávajúcu odpoveď, veľmi mi ujasnila situáciu Podľa všetkého teda vždy musím vytvoriť inštanciu, ak chcem využiť triedu, správne?
|
Nie, pokial chces triedu vyuzit iba ako balik metod tak nemusis vytvarat instanciu. Ide o obdobu statickych metod v JAVE
| kód: |
program Project4;
{$APPTYPE CONSOLE}
uses
SysUtils,Dialogs;
type
TUser = class
public
class procedure Create(name, surname, login, pass, email: string);
end;
var tt: string;
class procedure TUser.Create(name, surname, login, pass, email: string);
begin
showmessage('name : '+name+chr(10)+'surname : '+surname );
end;
begin
TUser.Create('Istvan','Sandokan','','','');
read(tt);
end.
|
|
| |
  |
 |
Manny
 Užívateľ
 Založený: 30.09.2009 Príspevky: 61
 | Zaslal: Ut 24.08.10 10:43 |   |
Statické triedy, to je ono! Díky moc coldak
Fico, aj ty si mi teraz veľmi pomohol, tie praktické príklady sú najjednoduchším vysvetlením funkcionalít tried (spolu s ovocím na http://www.delphibasics.co.uk/RTL.asp?Name=Class). Teraz je mi jasné, že to môžem riešiť buď dynamickou (pomenoval som to správne?) triedou zameranú na databázu, ktorá bude obsahovať metódy na prácu s užívateľmi alebo to spraviť cez statickú triedu. |
| |
   |
 |
|
Nemôžete pridávať nové témy do tohto fóra. Nemôžete odpovedať na témy v tomto fóre. Nemôžete upravovať svoje príspevky v tomto fóre. Nemôžete mazať svoje príspevky v tomto fóre. Nemôžete hlasovať v tomto fóre.
|
|