Jaka jest różnica pomiędzy obiektami a rekordami?

0

Jaka jest różnica między obiektem a rekordem i z którego kiedy korzystać?

1

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".

1

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 ;-)

0

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

1
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.

2

@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.

http://ideone.com/uW73cy


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.

3

Zrobił się w tym wątku niezły burdel i sporo mylących wypowiedzi.

Podsumuje może - mamy kilka przypadków:

  1. 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;
  1. 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;
  1. 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;

  1. 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; 
 
 
  1. Klasy-jak-rekordy w Free Pascal
    Patryk27 (stos?): http://pastebin.com/vK9ucWgL

1 użytkowników online, w tym zalogowanych: 0, gości: 1