Jaka jest różnica między obiektem a rekordem i z którego kiedy korzystać?
Obiekty to coś w rodzaju rekordów, tyle że mogą posiadać elementy takie, jak klasy - konstruktory, destruktory, metody, pola, właściwości, opakowane w jedną strukturę; Tak jak klasy mogą posiadać sekcje dostępu - prywatne, publiczne itd.; Różnica jest taka, że obiektów się nie tworzy - robi to menedżer pamięci; Instancje klas (nazywane także obiektami) trzeba stworzyć, aby móc z nich skorzystać (nie dotyczy metod statycznych);
Ich wykorzystanie jest zależne od "widzimisię" programisty - sam musisz ocenić, kiedy przyda Ci się obiekt, a kiedy rekord; Najpierw zapoznaj się z dokumentacją, w której opisana jest konstrukcja obiektu; A jak zrozumiesz czym się różnią od rekordów, to powinieneś już mniej więcej wiedzieć kiedy używać;
PS: Dzisiejsze kompilatory pozwalają na deklarowanie rekordów, posiadających metody - tzw. "advanced records".
Uuuu temat jest dość rozległy, poczytaj np. tu:
http://delphi.about.com/od/beginners/a/record_type.htm
Głowna różnica; obiekt jest instancją klasy. A co za tym idzie, wspiera wszelkie paradygmaty programowania obiektowego.
Rekord jest strukturą, która może zawierać dowolne inne typy danych w tym rekordy i obiekty (w nowszych wersjach może posiadać konstruktor, metody i właściwości. Mimo, że przypomina obiekt nadal jest rekordem!). Ale generalnie, mogą to być dowolne typy.
Każdy obiekt jest przekazywany przez referencję - zawsze.
Każdy rekord jest przekazywany przez wartość - zawsze.
Rekordu, z definicji, nie trzeba zwalniać.
Obiekt należy zwalniać zawsze.
Pamięć pod rekord jest alokowana na stosie, podobnie jak dla zmiennych lokalnych, parametrów wejściowych dla procedur i metod oraz typów zwracanych przez zmienną Result
oraz wywołań WinAPI.
Pamięć dla obiektów alokowana jest na stercie - podobnie dla struktur dynamicznych (np. open array) i dla typów string
, variant
i interfece
- ale te posiadają cykl życia automatycznie zarządzany przez Delphi i nie trzeba ich zwalniać.
Którego należy używać? Obu, wszystko zależy do czego ;-)
Teraz to ja nie wiem, czy pytacz miał na myśli obiekt jako instancję klasy, czy stare obiekty, typu:
type
TFoo = object
end;
W każdym razie mój poprzedni post dotyczy starych obiektów... :D
furious programming napisał(a):
Obiekty to coś w rodzaju rekordów, tyle że mogą posiadać elementy takie, jak klasy - konstruktory, destruktory, metody, pola, właściwości, opakowane w jedną strukturę; Tak jak klasy mogą posiadać sekcje dostępu - prywatne, publiczne itd.; Różnica jest taka, że obiektów się nie tworzy - robi to menedżer pamięci; Instancje klas (nazywane także obiektami) trzeba stworzyć, aby móc z nich skorzystać (nie dotyczy metod statycznych);
Pomyliłeś się; powinno być: *Różnica jest taka, że **rekordów *się nie tworzy - robi to menedżer pamięci
Poza tym, dziś rekord może zawierać dokładnie to samo co napisałeś o obiektach.
Ich wykorzystanie jest zależne od "widzimisię" programisty - sam musisz ocenić, kiedy przyda Ci się obiekt, a kiedy instancja klasy; Najpierw zapoznaj się z dokumentacją, w której opisana jest konstrukcja obiektu; A jak zrozumiesz czym się różnią od klas, to powinieneś już mniej więcej wiedzieć kiedy używać;
PS: Dzisiejsze kompilatory pozwalają na deklarowanie rekordów, posiadających metody - tzw. "advanced records".
I nie tylko to, a znacznie, znacznie więcej.
Poza tym ustalmy jasno - klasa to jest deklaracja obiektu.
Obiekt, jest to instancja (powołany do życia byt za pomocą specjalnej metody tzw. konstruktora) klasy.
Metoda - to procedura (lub funkcja, czyli procedura zwracająca wartość) obiektu (nie klasy, ponieważ wymaga utworzonego obiektu) .
Metoda klasowa - to specjalna metoda klasy, która nie wymaga do użycia instancji obiektu - wystarczy sam typ klasowy.
@wloochacz - moment, post który skomentowałeś zawiera opis starych obiektów, nie instacji klas, też zwanych obiektami;
Pomyliłeś się; powinno być: Różnica jest taka, że rekordów się nie tworzy - robi to menedżer pamięci
Starych obiektów się nie tworzy - menedżer pamięci alokuje dla nich pamięć, tak samo jak dla rekordów; Można z nich korzystać tak samo jak z rekordów, czyli od razu:
type
TFoo = object
private
FData: Integer;
public
procedure Update(AData: Integer);
procedure Show();
end;
procedure TFoo.Update(AData: Integer);
begin
FData := AData;
end;
procedure TFoo.Show();
begin
Write('Data: ', FData);
end;
var
fooTest: TFoo;
begin
fooTest.Update(255);
fooTest.Show();
ReadLn;
end.
Poza tym, dziś rekord może zawierać dokładnie to samo co napisałeś o obiektach.
To samo napisałem w ostatniej linijce swojego posta:
furious programming napisał(a)
PS: Dzisiejsze kompilatory pozwalają na deklarowanie rekordów, posiadających metody - tzw. "advanced records".
No, może nie aż tyle co by wypadało; Oczywiście pozwalają nie tylko na deklarację metod składowych, ale trudno w jednym poście opisać wszystkie rzeczy;
Nie wiem który przypadek ma na myśli pytacz, dlatego opisałem stare obiekty; Jeśli ma na myśli obiekty jako instancje klas, to Twój wcześniejszy post będzie dla niego wystarczającą odpowiedzią; W swoich kodach korzystam zarówno ze starych obiektów (ale sporadycznie), jak i z obiektów jako instancji klas, więc mnie nie musisz tłumaczyć różnicy pomiędzy nimi;
Nieścisłość naszych wypowiedzi wynika z tego, że dla mnie obiekt to obiekt (deklarowany ze słówkiem object
), a instancja klasy to instancja klasy; Może to dziś już niepoprawne nazewnictwo, w każdym razie wprowadza jednoznaczność;
I faktycznie pomyliłem się, bo zamiast tego:
sam musisz ocenić, kiedy przyda Ci się obiekt, a kiedy instancja klasy; Najpierw zapoznaj się z dokumentacją, w której opisana jest konstrukcja obiektu; A jak zrozumiesz czym się różnią od klas, to powinieneś już mniej więcej wiedzieć kiedy używać;
ma być:
sam musisz ocenić, kiedy przyda Ci się obiekt, a kiedy rekord; Najpierw zapoznaj się z dokumentacją, w której opisana jest konstrukcja obiektu; A jak zrozumiesz czym się różnią od rekordów, to powinieneś już mniej więcej wiedzieć kiedy używać;
Poprawiłem poprzedni post.
Zrobił się w tym wątku niezły burdel i sporo mylących wypowiedzi.
Podsumuje może - mamy kilka przypadków:
- Stare obiekty w rodzaju Turbo Pascal
http://www.comsc.uco.edu/~mcdaniel/cam/tpoop.html
type
MyObj = object
x,y : Integer;
constructor Init(i,j : integer);
procedure Display_Values;
destructor Done;
end;
Można je alokować na stosie lub na stercie:
a) Stos
var
My_Object : MyObj;
begin
My_Object.Init(0,0);
My_Object.x := 1;
My_Object.Display_Values;
My_Object.Done;
end;
b) Sterta
http://pl.scribd.com/doc/72873849/Borland-Turbo-Pascal-5-5-Object-Oriented-Programming-Guide
type
MyObjPtr = ^MyObj;
begin
MyObjPtr := New(MyObjPtr,Init(0,0));
...
Dispose(MyObjPtr, Done);
end;
- Rekordy
type MyRecord = record
a : integer;
b : real;
c,d,e,f : string
end;
a) Stos
var
rec: MyRecord;
b) Sterta
type MyRecordPtr = ^MyRecord;
var
recptr: MyRecordPtr;
begin
GetMem (recptr, SizeOf (MyRecord));
...
FreeMem (recptr, SizeOf (MyRecord));
end;
- Klasy Delphi
http://www.delphibasics.co.uk/Article.asp?Name=OO
Tylko sterta
type
// Define a simple class
TSimple = class(TObject)
simpleCount : Byte;
property count : Byte
read simpleCount;
procedure SetCount(count : Byte);
end;
var
simple: TSimple;
begin
simple := TSimple.Create;
...
simple.Free;
end;
- Rekordy z metodami (od Turbo Delphi)
http://delphi.about.com/od/adptips2006/qt/newdelphirecord.htm
(stos?)
type
TTurboRecord = record
strict private
fNameValue : integer;
function GetName: string;
public
NamePrefix : string;
constructor Create(const initNameValue : integer) ;
property Name : string read GetName;
end;
var
turboRecord : TTurboRecord;
begin
turboRecord := TTurboRecord.Create(2006) ;
//NO need to FREE record types
end;
-
Klasy-jak-rekordy w Free Pascal
Patryk27 (stos?): http://pastebin.com/vK9ucWgL