Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Нужен пример того, что нельзя сделать без


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

Автор: pseud 22.10.2008, 18:16
Код

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;

Автор: Delphist 22.10.2008, 18:48
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;

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

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

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

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

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

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

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

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

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

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

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


посмотри исходники VCL. 
TForm например. Вся обработка сообщений реализована в базовых классах. Без виртуальных функций там кода было раз 10 больше.

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

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

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

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

Автор: pseud 23.10.2008, 10:18
Цитата(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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)