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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2009, 12:58   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Что означает override, идущий после функции?

Что означает override, идущий после функции?
TwiX вне форума Ответить с цитированием
Старый 08.08.2009, 13:10   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

функция заменяет функцию родительского класса(корректное замещение)
тогда родительскую функцию можно вызвать использовать через inherited
это директива всегда нужна при разработке компонентов(еще где пока не знаю)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.08.2009, 13:15   #3
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Не туда написал.
puporev вне форума Ответить с цитированием
Старый 08.08.2009, 14:13   #4
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Спасибо.Вспомнил-ведь в AS3 тож есть override =)
А что такое inherited?
TwiX вне форума Ответить с цитированием
Старый 08.08.2009, 14:41   #5
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
А что такое inherited?
А что такое help?
Somebody вне форума Ответить с цитированием
Старый 08.08.2009, 16:48   #6
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Обращение к методу предка реализуется с помощью ключевого слова "inherited".
В Delphi, деструктор должен быть обязательно перекрытым "override"; и содержать вызов деструктора предка.
Alter вне форума Ответить с цитированием
Старый 08.08.2009, 18:14   #7
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
функция заменяет функцию родительского класса(корректное замещение)
А можно тут поподробней? Функции замещаются и без этой директивы. В чем выражается эта корректность? Есть какие-то грабли если не юзать этот оверрайд?
Если в предке функция не описана как virtual, то оверрайвить ее не получается, однако можно просто в потомке прописать такую же фукнцию и все будет работать. Насколько это коректно?
Sergey2 вне форума Ответить с цитированием
Старый 08.08.2009, 18:53   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Грабли

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TBaseClass = class
    fDynamicStuff: TStringList;
  public
    constructor Create; virtual;
    procedure Add(s:string);
    destructor Destroy; override;
  end;

  TCorrectClass = class(TBaseClass)
    fSomeNewField: integer;
  public
    constructor Create; override;
  end;

  TIncorrectClass = class(TBaseClass)
    fSomeNewField: integer;
  public
    constructor Create;
  end;

var
  Form1: TForm1;
  CorrectClass: TCorrectClass;
  IncorrectClass: TIncorrectClass;

implementation

{$R *.dfm}


{ TBaseClass }

constructor TBaseClass.Create;
begin
  fDynamicStuff := TStringList.Create
end;

procedure TBaseClass.Add(s: string);
begin
  fDynamicStuff.Add(s)
end;

destructor TBaseClass.Destroy;
begin
  fDynamicStuff.Free;
  inherited;
end;


{ TCorrectClass }

constructor TCorrectClass.Create;
begin
  inherited;   //вначале идёт вызов метода класса-родителя
  fSomeNewField := 100;
end;


{ TIncorrectClass }

constructor TIncorrectClass.Create;
begin
  fSomeNewField := 100;
end;


{button1,2}

procedure TForm1.Button1Click(Sender: TObject);
begin
  CorrectClass := TCorrectClass.Create;
  CorrectClass.Add('test');
  CorrectClass.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  IncorrectClass := TIncorrectClass.Create;
  IncorrectClass.Add('test');
  IncorrectClass.Free;
end;

end.
пыщь
JTG вне форума Ответить с цитированием
Старый 08.08.2009, 19:10   #9
Sergey2
Форумчанин
 
Регистрация: 08.01.2008
Сообщений: 233
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Грабли
Т.е. грабли в невозможности вызывать соответствующие функции предка?
Sergey2 вне форума Ответить с цитированием
Старый 08.08.2009, 22:32   #10
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Угу. Если вызывать метод родителя не нужно - его можно перекрывать, иначе директива override обязательна
пыщь
JTG вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что означает это сообщение? 54rus Помощь студентам 15 23.07.2009 18:05
Что означает маркировка кабеля Plenum Sjava Помощь студентам 1 22.05.2009 23:32
Что означает HWND_DESKTOP или Handle в функции MessageBox prikolist Общие вопросы C/C++ 5 18.03.2009 20:47
Подскажите пожалуйста, что означает строчка??? EDDY Паскаль, Turbo Pascal, PascalABC.NET 4 25.07.2008 16:32