Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен пример того, что нельзя сделать без, виртуальных ф-ции 
:(
    Опции темы
Delphist
Дата 22.10.2008, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Похоже я схожу с ума smile , сейчас делал эксперименты с наследованиями, у меня получилась такая фишка, что виртуальные ф-ции не нужны, т.е. я не нашел ни одной задачи с наследованием, которой бы я не решил без виртуальности. Приведите, пожалуйста, пример где без виртуальных ф-ций не обойтись, а то я окончательно рехнусь


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
pseud
Дата 22.10.2008, 18:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Код

unit Unit2;

interface

type
  TCoreEntity = class
    FValue: Variant;
    procedure SetValue(AValue: Variant); virtual; abstract;
  end;

type
  TSimpleEntity = class(TCoreEntity)
  public
    procedure SetValue(AValue: Variant); override;
  end;

type
  TComplexEntity = class(TCoreEntity)
  public
    procedure SetValue(AValue: Variant); override;
  end;

implementation

{ TSimpleEntity }

procedure TSimpleEntity.SetValue(AValue: Variant);
begin
  FValue := AValue;
end;

{ TComplexEntity }

procedure TComplexEntity.SetValue(AValue: Variant);
begin
  FValue := AValue + 1000;
end;

end.


Код

unit Unit1

//...

uses
  Unit2;

{$R *.dfm}

procedure SetAndShow(AEntity: TCoreEntity);
begin
  AEntity.SetValue(1);
  ShowMessage(AEntity.FValue);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ent: TCoreEntity;
begin
  ent := TSimpleEntity.Create;
  try
    SetAndShow(ent); // показывает 1
  finally
    ent.Free;
  end;

  ent := TComplexEntity.Create;
  try
    SetAndShow(ent); // показывает 1001
  finally
    ent.Free;
  end;
end;


Это сообщение отредактировал(а) pseud - 22.10.2008, 18:18


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Delphist
  Дата 22.10.2008, 18:48 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



pseud, 
OK, а что нам мешает сделать так:
Код

...
type
  TCoreEntity = class
    FValue: Variant;
    procedure SetValue(AValue: Variant); 
  end;

type
  TSimpleEntity = class(TCoreEntity)
  public
    procedure SetValue(AValue: Variant);  
 end;

type
  TComplexEntity = class(TCoreEntity)
  public
    procedure SetValue(AValue: Variant); 
  end;

implementation

{ TSimpleEntity }

procedure TSimpleEntity.SetValue(AValue: Variant);
begin
  FValue := AValue;
end;

{ TComplexEntity }

procedure TComplexEntity.SetValue(AValue: Variant);
begin
  FValue := AValue + 1000;
end;



--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Bose
Дата 22.10.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(Delphist @  22.10.2008,  18:48 Найти цитируемый пост)
а что нам мешает сделать так:

А если у тебя в SetValue(AValue: Variant) не одна строка кода, а 40? Что будешь делать, Delphist?


Это сообщение отредактировал(а) Bose - 22.10.2008, 22:39
PM MAIL WWW Skype   Вверх
Delphist
Дата 22.10.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Bose @  22.10.2008,  22:13 Найти цитируемый пост)
А если у тебя в SetValue(AValue: Variant) не одна строка кода, 40? Что будешь делать, Delphist?

тот же самый код что ты напишешь для виртуальной ф-ции?


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Bose
Дата 22.10.2008, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(Delphist @  22.10.2008,  22:24 Найти цитируемый пост)
тот же самый код что ты напишешь для виртуальной ф-ции?

а если не 40 строк, а 140 кода?

а потом выяснится что ещё и с ошибками... так и будешь во всех местах исправлять одни и те же ошибки?

Это сообщение отредактировал(а) Bose - 22.10.2008, 22:40
PM MAIL WWW Skype   Вверх
Delphist
Дата 22.10.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 2
Всего: 3



Цитата(Bose @  22.10.2008,  23:39 Найти цитируемый пост)
а если не 40 строк, а 140 кода?

а потом выяснится что ещё и с ошибками... так и будешь во всех местах исправлять одни и те же ошибки?

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


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Bose
Дата 23.10.2008, 04:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(Delphist @  22.10.2008,  23:17 Найти цитируемый пост)
ну ты как бы поступил с виртуальными ф-циями вот покажи на своем примере


посмотри исходники VCL. 
TForm например. Вся обработка сообщений реализована в базовых классах. Без виртуальных функций там кода было раз 10 больше.
PM MAIL WWW Skype   Вверх
aktuba
Дата 23.10.2008, 05:43 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата(Delphist @  22.10.2008,  19:02 Найти цитируемый пост)
Приведите, пожалуйста, пример где без виртуальных ф-ций не обойтись, а то я окончательно рехнусь 

Не поверишь - даже без Delphi можно обойтись, но с Delphi проще ;). Так и с виртуальными функциями. Теоретически, обойтись легко. Но если применять правильно, проще расширять и поддерживать, в дальнейшем.


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Felan
Дата 23.10.2008, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 2.8.2007
Где: Самара

Репутация: 2
Всего: 7



Цитата(Bose @  22.10.2008,  23:13 Найти цитируемый пост)
а что нам мешает сделать так:

А если базовый класс и потомка разрабатывают разные люди. И у них только свои исходники?


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
pseud
Дата 23.10.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 10
Всего: 40



Цитата(Delphist @  22.10.2008,  18:48 Найти цитируемый пост)
OK, а что нам мешает сделать так:

должен тебя расстроить, но тогда в коде:
Код

var
  ent: TCoreEntity;
begin
  ent := TSimpleEntity.Create;
  ent.SetValue(1);
  ent.Free;
end;

вызовется метод 
Код

TCoreEntity.SetValue

в моем же примере вызовется то что надо:
Код

TSimpleEntity.SetValue


Добавлено через 1 минуту и 52 секунды
ООП блин
полиморфизм ето что ли
а может инкапсуляция
вечно я их путаю  smile 



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.