Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2012, 20:08   #1
illuminates
 
Регистрация: 05.06.2012
Сообщений: 8
Восклицание в чем отличие class от object?

помогите пожалуйста, учитель задал вопрос "в чем отличие class от object?" то есть можно програминовать пиша не class а object. и дал подсказку что отличие в наследовании. Очень был бы признателен за помощь.
illuminates вне форума Ответить с цитированием
Старый 05.06.2012, 21:01   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

object — это рудимент от досовского паскаля, чудом сохранившийся до наших дней
не может иметь dynamic методов и published свойств

object нельзя наследовать от class, и наоборот
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 05.06.2012, 23:39   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

object в первую очередь это структура с методами(по сути) хранится так же на стеке.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.06.2012, 00:47   #4
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Класс - шаблон, на основе которого будет создан конкретный объект. Имеет свойства и методы. Пример класса - дерево.
Объект - "копия класса", конкретный экземпляр класса. Им мы уже можем манипулировать - вызывать методы и изменять свойства. Пример объекта - сосна.
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 06.06.2012, 01:47   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Object - базовый класс ООП. Был, есть и будет.

обьявление вида:
Цитата:
type
TSameType = class
равносильно
Цитата:
type
TSameType = class(TObject)
Факт. это неявное обьявление выше приведеного кода.

В инспекторе обьектов(в режиме редактора кода), видно как приравнивает анализатор кода на лету ^^ код.

любой, абсолютно любой, класс явл. наследником TObject.

Выдержка из модуля system.pas:
Цитата:
type

TObject = class;

TClass = class of TObject;


...

TObject = class
constructor Create;
procedure Free;
class function InitInstance(Instance: Pointer): TObject;
procedure CleanupInstance;
function ClassType: TClass;
class function ClassName: ShortString;
class function ClassNameIs(const Name: string): Boolean;
class function ClassParent: TClass;
class function ClassInfo: Pointer;
class function InstanceSize: Longint;
class function InheritsFrom(AClass: TClass): Boolean;
class function MethodAddress(const Name: ShortString): Pointer;
class function MethodName(Address: Pointer): ShortString;
function FieldAddress(const Name: ShortString): Pointer;
function GetInterface(const IID: TGUID; out Obj): Boolean;
class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry;
class function GetInterfaceTable: PInterfaceTable;
function SafeCallException(ExceptObject: TObject;
ExceptAddr: Pointer): HResult; virtual;
procedure AfterConstruction; virtual;
procedure BeforeDestruction; virtual;
procedure Dispatch(var Message); virtual;
procedure DefaultHandler(var Message); virtual;
class function NewInstance: TObject; virtual;
procedure FreeInstance; virtual;
destructor Destroy; virtual;
end;
ООП повсюду. Вы его используете, даже не зная об этом.

Все что не явл. классом, всего лишь структура данных(тип), и от неё нельзя сделать наследование.
К этом отличие класса от типа данных.

т.е. так:
Код:
type
  TDataType = record
  TROLFACe:string;
  end;

 type
  TSomeClass=Class(TDataType)
за это нас пошлют далееко в лес!

Последний раз редактировалось Человек_Борща; 06.06.2012 в 01:52.
Человек_Борща вне форума Ответить с цитированием
Старый 06.06.2012, 09:28   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
object в первую очередь это структура с методами(по сути) хранится так же на стеке.
да, это тоже важное отличие. Хотя при желании объект можно создавать и на куче:

Код:
{$APPTYPE CONSOLE }

type
  //
  PAnimal = ^TAnimal;
  TAnimal = object
  private
    f_name: string;
  protected
    procedure sayHi(); virtual;
  public
    constructor new(const name: string);
    destructor done(const reason: string);
    //
    procedure hi();
  end;

  //
  TDog = object(TAnimal)
  protected
    procedure sayHi(); virtual;
  end;


{ TAnimal }

// --  --
destructor TAnimal.done(const reason: string);
begin
  writeln('I''m done, ', reason);
end;

// --  --
procedure TAnimal.hi();
begin
  sayHi();
end;

// --  --
constructor TAnimal.new(const name: string);
begin
  f_name := name;
  //
  inherited;
end;

// --  --
procedure TAnimal.sayHi();
begin
  writeln('Hi, I''m ', f_name);
end;


{ TDog }

// --  --
procedure TDog.sayHi();
begin
  writeln('Woof-woof, I''m ', f_name);
end;


var
  A: PAnimal;
  D: TDog;
begin
  // on heap
  New(A, new('Rhino'));
  A.hi();
  Dispose(A, done('gone fishing.'));
  //
  // on stack
  D.new('Bolt');
  D.hi();
  D.done('sleep time.');
end.
Ещё при перекрытии методов у объектов следует писать virtual, а не override.
И, если не ошибаюсь, в паскале допускались виртуальные конструкторы у объектов. Это реально срывало крышу ) Сейчас это забанили.

Человек_Борща, походу, перепутали ключевое слово object и класс TObject.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 06.06.2012, 12:36   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
И, если не ошибаюсь, в паскале допускались виртуальные конструкторы у объектов. Это реально срывало крышу ) Сейчас это забанили.
Как забанили? Или я что-то не так понял?
Код:
{$APPTYPE CONSOLE}

type
  TSort = class(TObject)
    constructor Create(); virtual; abstract;
  end;

  TBubbleSort = class(TSort)
    constructor Create(); override;
  end;

  TQuickSort = class(TSort)
    constructor Create(); override;
  end;

  TSortClass = class of TSort;

constructor TBubbleSort.Create();
begin
  WriteLn('TBubbleSort.Create');
end;

constructor TQuickSort.Create();
begin
  WriteLn('TQuickSort.Create');
end;

var
  SortClass: TSortClass;
  Sort: TSort;

begin
  SortClass := TBubbleSort;
  Sort := SortClass.Create();
  ReadLn;
  Sort.Free();
end.
Somebody вне форума Ответить с цитированием
Старый 06.06.2012, 13:25   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

забанили для object, такое уже не прокатывает:

Код:
  TPerson = object
    constructor Create(); virtual;
  end;
а для классов, да, этот костыль оставили, иначе class reference вызывают конструктор того класса, на который объявлена ссылка.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 06.06.2012, 15:21   #9
illuminates
 
Регистрация: 05.06.2012
Сообщений: 8
По умолчанию "всем спасибо, все свободны!"

огромное спасибо господа, все очень хорошо помогли разобраться в этом деле!
illuminates вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отличие type T = Object от type T = Class? Warn Общие вопросы Delphi 8 04.11.2011 19:20
Процедуры и функции. В чем отличие? Умелец Паскаль, Turbo Pascal, PascalABC.NET 12 20.10.2010 19:59
В чем отличие меток с @ от обычных? Hant111 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 21.04.2010 04:12
Record, object or class type required @mazonk@ Помощь студентам 0 07.06.2009 13:03
В чем отличие С++ от С# valerij Свободное общение 14 10.03.2009 03:00