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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование и передача параметров 
V
    Опции темы
DarkProg
  Дата 10.1.2013, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Добрый день. 

Что-то я то ли загнался и не вижу очевидного решения, то ли я чего-то не знаю...

Значит попробую обрисовать проблему, у меня есть вроде такой системы классов, для обработки файлов, существует два формата файлов, различия достаточно серьёзные, но общий принцип обработки есть, т.е. как бы шаг1, шаг2, шаг3 и т.д.

Система упрощённо выглядит так
Код

Type
   TBaseClass=class
       procedure MyProc(); Virtual;
   end;

  TFirstType= class(TBaseClass)
      procedure MyProc(); override;
  end;

  TSecondType= class(TBaseClass)
      procedure MyProc(); override;
  end;

....

procedure TBaseClass.MyProc();
Var p:string;
begin
    p:=GetSomeValue; //Вычислил некое значение, с которым потом что-то буду делать
    //чего-то делаем используя значение
end;

procedure TFirstType.MyProc();
Var p:string;
begin
    inherited MyProc;
    p:=GetSomeValue; //Опять тоже самое значение, с которым потом что-то буду делать
    //чего-то делаем используя значение
end;

procedure TSecondType.MyProc();
Var p:string;
begin
    inherited MyProc;
    p:=GetSomeValue;  //Опять тоже самое значение, с которым потом что-то буду делать
    //чего-то делаем используя значение
end;


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

Как решение, я ввёл у базовой функции переменную Buffer типа Variant и сделал так
Код


procedure TBaseClass.MyProc();
Var p:string;
begin
    p:=GetSomeValue; //Вычислил некое значение, с которым потом что-то буду делать
    //чего-то делаем используя значение
    Buffer:=p;
end;

procedure TFirstType.MyProc();
Var p:string;
begin
    inherited MyProc;
    p:=Buffer; Достаём значение из буфера
     //чего-то делаем используя значение
end;

procedure TSecondType.MyProc();
Var p:string;
begin
    inherited MyProc;
    p:=Buffer; Достаём значение из буфера
    //чего-то делаем используя значение
end;



Получается проблема решена, но мне не нравится способ решения, может можно как-то более элегантнее или правильнее решить данную проблему?


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
k0rvin
Дата 10.1.2013, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 1
Всего: 5



Зачем тебе какой-то промежуточный буфер? Сделай p protected-полем базового класса и юзай ее на здоровье в потомках:
Код

type
  TBase = class
  protected
    fP: string;
  public
    procedure MyProc; virtual;
  end;

  TFirst = class (TBase)
    procedure MyProc; override;
  end;

  TSecond = class (TBase)
    procedure MyProc; override;
  end;

procedure TBase.MyProc;
begin
  fP := GetSomeValue;
  WriteLn('Base: ', fP);
end;

procedure TFirst.MyProc;
begin
  inherited MyProc;
  WriteLn('First: ', fP);
end;

procedure TSecond.MyProc;
begin
  inherited MyProc;
  WriteLn('Second: ', fP);
end;


или вообще вот так (пишу по памяти, могут быть ошибки):

Код

type
  TBase = class
  protected
    fP: string;
    procedure AfterMyProc; virtual;
  public
    procedure MyProc;
  end;

  TFirst = class (TBase)
  protected
    procedure AfterMyProc; override;
  end;

  TSecond = class (TBase)
  protected
    procedure AfterMyProc; override;
  end;

procedure TBase.MyProc;
begin
  fP := GetSomeValue;
  WriteLn('Base: ', fP);
  AfterMyProc;
end;

procedure TBase.AfterMyProc;
begin
end;

procedure TFirst.AfterMyProc;
begin
  WriteLn('First: ', fP);
end;

procedure TSecond.AfterMyProc;
begin
  WriteLn('Second: ', fP);
end;



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
DarkProg
Дата 10.1.2013, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



k0rvin, ты не понял меня. Мне это значение нужно один раз, конкретно в этой функции, для этого объявлять целую переменную и держать под него выделенную память чего-то совсем не хочется, метод мне этот тоже даром не нужен ни у потомков ни у предка(он вообще не в виде метода существует, а в виде нескольких преобразований на один раз).

Точно второй вариант... блин... половина кода на таком же принципе, просто надо разбить на подфункции и соответствующие реализации сделать у потомком... и без всяких левых переменных, переменную можно передавать в качестве параметра функциям...

Точно загнался... блин...

Это сообщение отредактировал(а) DarkProg - 10.1.2013, 13:01


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  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.0719 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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