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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация подпрограммы в дочернем классе 
V
    Опции темы
Keeper89
Дата 9.8.2010, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 20
Всего: 58



Доброго времени суток.

Имеется класс TProblem с методом Solve:
Код

var
  FSolution: Real;

procedure TProblem.Solve();
begin
  FTime = GetTickCount;

  MainSolveRoutine();

  FTime = GetTickCount - FTime;
end;

где MainSolveRoutine реализуется потомком (например Problem1 = class(TProblem)), и полученный в ней результат должен возвращаться в FSolution.

Правильна и возможна ли такая структура? Стоит ли и есть ли возможность ее улучшить?

Спасибо.

Это сообщение отредактировал(а) Keeper89 - 9.8.2010, 13:54


--------------------
PM MAIL WWW   Вверх
Frees
Дата 9.8.2010, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 54



Цитата(Keeper89 @  9.8.2010,  16:52 Найти цитируемый пост)
Правильна и возможна ли такая структура? Стоит ли и есть ли возможность ее улучшить?

правильна, для этого придуманы virtual методы - вызов метода потомка из родителя

Добавлено @ 14:48
имеет смысл если таких потомков несколько и у каждого своя реализация MainSolveRoutine(); 

Это сообщение отредактировал(а) Frees - 9.8.2010, 14:48


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Keeper89
Дата 9.8.2010, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 20
Всего: 58



Frees, ок. А как тогда реализовать дочернюю процедуру с возвращением значений в родительский FSolution?


--------------------
PM MAIL WWW   Вверх
Frees
Дата 9.8.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 9
Всего: 54



Цитата(Keeper89 @  9.8.2010,  17:52 Найти цитируемый пост)
А как тогда реализовать дочернюю процедуру с возвращением значений в родительский FSolution

не совсем понял что такое  FSolution
понял

FSolution не принадлежит классу, поэтому она везде будет иметь одно и  тоже значение..

Добавлено через 3 минуты и 57 секунд
FSolution - сделай полем класса TProblem  и пиши в нее, в потомках из нее можешь читать...

Это сообщение отредактировал(а) Frees - 9.8.2010, 14:57


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Qu1nt
Дата 9.8.2010, 15:25 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 18
Всего: 50



Код

FSolution := MainSolveRoutine;

Кстати, тип Real - устаревший. Используй Double.
PM MAIL   Вверх
Keeper89
Дата 9.8.2010, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 20
Всего: 58



Qu1nt, я его и использую, это просто для примера.

Это сообщение отредактировал(а) Keeper89 - 9.8.2010, 23:11


--------------------
PM MAIL WWW   Вверх
pseud
Дата 10.8.2010, 13:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Keeper89, ну как бы так...
Код

type
  TProblem = class
  private
    procedure Solve;
  protected
    procedure MainSolveRoutine; virtual; abstract;
  public
    FSolution: Double;
  end;

type
  TBigProblem = class(TProblem)
  protected
    procedure MainSolveRoutine; override;
  end;

{ TBigProblem }

procedure TBigProblem.MainSolveRoutine;
begin
  FSolution := 77.77;
end;

{ TProblem }

procedure TProblem.Solve;
begin
  MainSolveRoutine;
  if FSolution = 77.77 then;
end;


проверка:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TBigProblem.Create do
  try
    Solve;
    ShowMessage(FloatToStr(FSolution));
  finally
    Free;
  end;
end;



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


Эксперт
****


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

Репутация: 20
Всего: 58



pseud, спасибо, утром реализовал как раз такую вещь smile


--------------------
PM MAIL WWW   Вверх
Keeper89
Дата 11.8.2010, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 20
Всего: 58



Вопрос в тему. Если во втором случае перенести
Код

MainSolveRoutine

из protected в private, будут соответствующие ворнинги.
Стоит так делать или лучше оставить в protected?


--------------------
PM MAIL WWW   Вверх
pseud
Дата 11.8.2010, 09:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Keeper89 @  11.8.2010,  01:11 Найти цитируемый пост)
из protected в private, будут соответствующие ворнинги.
Стоит так делать или лучше оставить в protected?

варнингов не будет, будет лишь хинт:
Цитата

[Hint] Unit1.pas(22): Overriding virtual method 'TBigProblem.MainSolveRoutine' has lower visibility (private) than base class 'TProblem' (protected)

А какой смысл переносить в private? Только если ты планируешь создавать классы-наследники TBigProblem, описываемые в других модулях, и в них ну совсем нельзя переопределять метод MainSolveRoutine.
Понижать видимость не принято.


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


Эксперт
****


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

Репутация: 20
Всего: 58



Цитата(pseud @  11.8.2010,  09:54 Найти цитируемый пост)
Понижать видимость не принято. 

Ok, спасибо.


--------------------
PM MAIL WWW   Вверх
cat512
Дата 20.8.2010, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(pseud @ 10.8.2010,  13:58)
Keeper89, ну как бы так...
Код

type
  TProblem = class
  private
    procedure Solve;
  protected
    procedure MainSolveRoutine; virtual; abstract;
  public
    FSolution: Double;
  end;

type
  TBigProblem = class(TProblem)
  protected
    procedure MainSolveRoutine; override;
  end;

{ TBigProblem }

procedure TBigProblem.MainSolveRoutine;
begin
  FSolution := 77.77;
end;

{ TProblem }

procedure TProblem.Solve;
begin
  MainSolveRoutine;
  if FSolution = 77.77 then;
end;


проверка:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TBigProblem.Create do
  try
    Solve;
    ShowMessage(FloatToStr(FSolution));
  finally
    Free;
  end;
end;

А что мешает использовать FSolution в секции Private?
PM MAIL   Вверх
pseud
Дата 23.8.2010, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(cat512 @  20.8.2010,  23:04 Найти цитируемый пост)
А что мешает использовать FSolution в секции Private?

напрмер, вот это:
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ...
  ShowMessage(FloatToStr(FSolution));
  ...
end;



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


Опытный
**


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

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



Ну так сделай свойство у класса
Код

private
  FSolution: double;
public
  property Solution: double read FSolution write FSolution;
 
И юзай его другим классом. Предыдущими примерами ты нарушаеш инкапсуляцию
PM MAIL   Вверх
pseud
Дата 23.8.2010, 14:24 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ОФФ
Цитата(cat512 @  23.8.2010,  12:52 Найти цитируемый пост)
И юзай его другим классом. Предыдущими примерами ты нарушаеш инкапсуляцию

во-первых, не я держатель темы.
во-вторых, в теме поднят вопрос "Как намазать хлеб на масло?". А твой ответ звучит как "Масло нужно достать из холодильника, а не из шкафчика" 
в-третьих, тема давно решена и нет никакого смысла вываливать ее на верх раздела.

Добавлено через 6 минут и 46 секунд
а с полиморфизмом и наследованием я ничего хоть не напорол?


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
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.0640 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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