Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Преграды использования полиморфизма  [new]
фываенг
Member

Откуда:
Сообщений: 52
Всем привет, подскажите пожалуйста
Есть базовый класс и два от него производных:

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

Как это лучше всего сделать?
Или
Это вообще хороший способ? По правилам ли так, что данные относящиеся к производным классам, хранятся в полях базового класса?
27 дек 18, 14:30    [21774784]     Ответить | Цитировать Сообщить модератору
 Re: Преграды использования полиморфизма  [new]
RWolf
Member

Откуда: Казань
Сообщений: 428
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]);
}
27 дек 18, 14:46    [21774824]     Ответить | Цитировать Сообщить модератору
 Re: Преграды использования полиморфизма  [new]
Beltar
Member

Откуда:
Сообщений: 199
А что, на Delphi теперь пишут с фигурными скобками, или это д/б в разделе по какому-то Си-языку?
27 дек 18, 14:51    [21774835]     Ответить | Цитировать Сообщить модератору
 Re: Преграды использования полиморфизма  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3903
Beltar
А что, на Delphi теперь пишут с фигурными скобками, или это д/б в разделе по какому-то Си-языку?

Да, можно и с фигурными скобками писать, особенно если побольше блоки ими выделять. Откомпилируется без ошибок и не повредятся данные в рантайме.
27 дек 18, 15:02    [21774861]     Ответить | Цитировать Сообщить модератору
 Re: Преграды использования полиморфизма  [new]
V.Borzov
Member

Откуда: Саратов
Сообщений: 269
YuRock
....
Откомпилируется без ошибок и не повредятся данные в рантайме.

Имеете ввиду, что меньше шансов что-либо сломать?
27 дек 18, 19:04    [21775148]     Ответить | Цитировать Сообщить модератору
 Re: Преграды использования полиморфизма  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5213
если в общем случае, то так

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.
27 дек 18, 19:21    [21775170]     Ответить | Цитировать Сообщить модератору
 Re: Преграды использования полиморфизма  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5213
Квейд
если в общем случае, то так

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.


очепятался

type
  TStructureOfData = record 
    А: Integer;
  end;
27 дек 18, 19:22    [21775172]     Ответить | Цитировать Сообщить модератору
 Re: Преграды использования полиморфизма  [new]
cptngrb
Member

Откуда:
Сообщений: 341
YuRock, ))))
28 дек 18, 08:42    [21775417]     Ответить | Цитировать Сообщить модератору
 Re: Преграды использования полиморфизма  [new]
Beltar
Member

Откуда:
Сообщений: 199
И производительность максимальная, ведь самый быстрый код - это код, который не выполнился.
28 дек 18, 09:19    [21775438]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить