Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преграды использования полиморфизма / 9 сообщений из 9, страница 1 из 1
27.12.2018, 14:30
    #39753919
фываенг
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
Всем привет, подскажите пожалуйста
Есть базовый класс и два от него производных:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
class Food {
  massive: array of Structure_of_data; (массив, элементы которого - структура данных)
  constructor Create;
}

Food.Create {
  // [color=green]алгоритм для заполнения massive[/color]
}

class bun(Food) {
  constructor Create;  
}

class butter(Food) {
  constructor Create;
}

{ bun }

const 
  // Здесь константные массивы строк, относящиеся к bun и предназначенные для заполнения структуры данных (то есть тут данные относящиеся к этому классу, но записать их я хочу (c помощью [color=green]алгоритма в Food.Create[/color]) в поле massive)

bun.Create() {

}

{ butter }

const 
  // Здесь константные массивы строк, относящиеся к butter и предназначенные для заполнения структуры данных

butter.Create() {

}



Данные разные, но алгоритм заполнения структуры данных одинаковый (именно поэтому я и вынес его в базовый класс). И вот не понимаю я, именно как их лучше всего передать в конструктор базового класса, потому что через аргументы это тупо. Или лучше как то переделать код, вот он вопрос

В итоге я хочу создать два объекта класса bun и butter, и чтобы у объекта класса bun в поле massive были данные относящиеся к классу bun, а чтобы у объекта класса butter в поле massive были данные относящиеся к классу butter

Потому что алгоритм обработки этих данных далее тоже одинаковый
И все методы для обработки этих данных далее я хочу поместить в класс Food

Как это лучше всего сделать?
Или
Это вообще хороший способ? По правилам ли так, что данные относящиеся к производным классам, хранятся в полях базового класса?
...
Рейтинг: 0 / 0
27.12.2018, 14:46
    #39753936
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class Food {
 massive: array of Integer;
 constructor Create(const AData: array of Integer);
}

Food.Create() {
  //обработать AData
}

Bun.Create() {
  inherited Create([1, 2, 3, 4]);
}

Butter.Create() {
  inherited Create([5, 6, 7, 8]);
}
...
Рейтинг: 0 / 0
27.12.2018, 14:51
    #39753942
Beltar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
А что, на Delphi теперь пишут с фигурными скобками, или это д/б в разделе по какому-то Си-языку?
...
Рейтинг: 0 / 0
27.12.2018, 15:02
    #39753960
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
BeltarА что, на Delphi теперь пишут с фигурными скобками, или это д/б в разделе по какому-то Си-языку?
Да, можно и с фигурными скобками писать, особенно если побольше блоки ими выделять. Откомпилируется без ошибок и не повредятся данные в рантайме.
...
Рейтинг: 0 / 0
27.12.2018, 19:04
    #39754142
V.Borzov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
YuRock....
Откомпилируется без ошибок и не повредятся данные в рантайме.
Имеете ввиду, что меньше шансов что-либо сломать?
...
Рейтинг: 0 / 0
27.12.2018, 19:21
    #39754154
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
если в общем случае, то так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
type
  TStructureOfData = record 
    Data: Integer;
  end;

  TFood = class
  protected
    FMassive: array of TStructureOfData;
    procedure InitMassive; virtual; abstract;
    procedure ProcessMassive;
  public
    constructor Create;
  end;

  TBun = class(TFood)
  protected
    procedure InitMassive; override;
  end;

  TButter = class(TFood)
  protected
    procedure InitMassive; override;
  end;

implementation

{ TFood }

constructor TFood.Create;
begin
  InitMassive;
  ProcessMassive;
end;

procedure TFood.ProcessMassive;
var
  I: Integer;
begin
  for I := 0 to High(FMassive) do
    ShowMessage(FMassive[I].A.ToString)
end;

{ TBun }

procedure TBun.InitMassive;
var
  I: Integer;
begin
  SetLength(FMassive, 10);
  for I := 0 to High(FMassive) do
    FMassive[I].A := Random(100)
end;

{ TButter }

procedure TButter.InitMassive;
var
  I: Integer;
begin
  SetLength(FMassive, 20);
  for I := 0 to High(FMassive) do
    FMassive[I].A := Random(100)
end;

end.
...
Рейтинг: 0 / 0
27.12.2018, 19:22
    #39754155
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
Квейдесли в общем случае, то так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
type
  TStructureOfData = record 
    Data: Integer;
  end;

  TFood = class
  protected
    FMassive: array of TStructureOfData;
    procedure InitMassive; virtual; abstract;
    procedure ProcessMassive;
  public
    constructor Create;
  end;

  TBun = class(TFood)
  protected
    procedure InitMassive; override;
  end;

  TButter = class(TFood)
  protected
    procedure InitMassive; override;
  end;

implementation

{ TFood }

constructor TFood.Create;
begin
  InitMassive;
  ProcessMassive;
end;

procedure TFood.ProcessMassive;
var
  I: Integer;
begin
  for I := 0 to High(FMassive) do
    ShowMessage(FMassive[I].A.ToString)
end;

{ TBun }

procedure TBun.InitMassive;
var
  I: Integer;
begin
  SetLength(FMassive, 10);
  for I := 0 to High(FMassive) do
    FMassive[I].A := Random(100)
end;

{ TButter }

procedure TButter.InitMassive;
var
  I: Integer;
begin
  SetLength(FMassive, 20);
  for I := 0 to High(FMassive) do
    FMassive[I].A := Random(100)
end;

end.



очепятался

Код: pascal
1.
2.
3.
4.
type
  TStructureOfData = record 
    А: Integer;
  end;
...
Рейтинг: 0 / 0
28.12.2018, 08:42
    #39754320
cptngrb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
YuRock, ))))
...
Рейтинг: 0 / 0
28.12.2018, 09:19
    #39754337
Beltar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преграды использования полиморфизма
И производительность максимальная, ведь самый быстрый код - это код, который не выполнился.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Преграды использования полиморфизма / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]