Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
Autor | Správa |
---|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | 18 |
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é?
|
|
Registrovaný: 11.01.09 Prihlásený: 23.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
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.
|
|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | 18 |
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 :/
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 |
asi myslis class metody tried , ale najprv si to poriadne nastuduj
|
|
Registrovaný: 11.01.09 Prihlásený: 23.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
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.
|
|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | 18 |
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');
|
|
Registrovaný: 11.01.09 Prihlásený: 23.11.24 Príspevky: 1395 Témy: 10 | 10 Bydlisko: Hrinova |
Manny píše: 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.
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 |
Manny píše: 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.
|
|
Registrovaný: 01.10.09 Prihlásený: 12.03.17 Príspevky: 86 Témy: 18 | 18 |
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.
_________________ Bad news: Time flies. God news: You are the pilot! |
|
Stránka: 1 z 1
| [ Príspevkov: 9 ] | |
|