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


Автор: DarkProg 10.1.2013, 11:56
Добрый день. 

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

Значит попробую обрисовать проблему, у меня есть вроде такой системы классов, для обработки файлов, существует два формата файлов, различия достаточно серьёзные, но общий принцип обработки есть, т.е. как бы шаг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;



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

Автор: k0rvin 10.1.2013, 12:34
Зачем тебе какой-то промежуточный буфер? Сделай 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;

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

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

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

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