Как реализовать множественное наследование в Дельфи?

Если у Вас есть много логических задач, которые требуют постоянной обработки, и Вы хотите, это, чтобы быть сделанным в параллели использует pool+scheduler.

, Если необходимо сделать IO, связал задачи одновременно, такие как загрузка материала от удаленных серверов или доступа к диску, но потребность сделать это говорит один раз в несколько минут, затем сделайте собственные потоки и уничтожьте их, после того как Вы закончены.

Редактирование: О некоторых соображениях я использую пулы потоков для доступа к базе данных, физики/моделирования, AI (игры), и для задач в виде сценария работал на виртуальных машинах, которые обрабатывают много определяемых пользователем задач.

Обычно пул состоит из 2 потоков на процессор (так, вероятно, 4 в наше время), однако можно настроить сумму потоков, которые Вы хотите, если Вы знаете, в скольких Вы нуждаетесь.

Редактирование: причина сделать Ваши собственные потоки из-за изменений контекста, (thats, когда потоки должны загрузить и из процесса, наряду с их памятью). Наличие бесполезных изменений контекста, говорят, когда Вы не используете свои потоки, просто оставление их сидит без дела, как можно было бы сказать, может легко половина производительности Вашей программы (скажите, что у Вас есть 3 потока сна и 2 активных потока). Таким образом, если те, которые загружают потоки, просто ожидают, они съедают выше на тонны ЦП и охлаждают кэш для Вашего реального приложения

14
задан Kromster says support Monica 6 January 2017 в 14:54
поделиться

6 ответов

Delphi не поддерживает множественное наследование. Но классы могут поддерживать / реализовывать несколько интерфейсов, и вы можете делегировать реализацию интерфейса, чтобы вы могли имитировать множественное наследование.

17
ответ дан 1 December 2019 в 06:08
поделиться

Использовать интерфейсы. Что-то вроде этого (вне моей головы, на основе вашего описания ...)

type

  IBikeWheel = interface
    ...
  end;

  IXYZ = interface
    ...
  end;

  IFrontWheel = interface(IBikeWheel)
    ...
  end;


  TBike = class
    ...
  end;

  TBikeWheel = class(TObject, IBikeWheel);

  TBikeWheelXYZ = class(TBikeWheel, IXYZ);

  TBikeFrontWheelXYZ = class(TBikeWheelXYZ, IFrontWheel);

Затем реализуйте классы для интерфейсов, которые делают то, что делают соответствующие классы в вашей старой (предположительно C / C ++) библиотеке, и создайте их экземпляры в конструкторе соответствующего класса.

16
ответ дан 1 December 2019 в 06:08
поделиться

Используйте полиморфизм, чтобы внедрить каждую «вещь» как отдельную иерархию объектов, а затем добавить свойства объекта к этому объекту по очереди. Итак, создайте иерархию колес и иерархию велосипедов. Затем добавьте колеса к велосипедам в качестве полей в родительском объекте bike. См. Ниже:

  TBikeWheel = class
  TBikeWheelXYZ = class( TBikeWheel ) 

  TBike = class
    FFrontWheel : TBikeWheel;
    property FrontWheel : TBikeWheel
      read FrontWhell  

  TBikeABC = class( TBike)
    constructor Create;
  end;

  constructor TBikeABC.Create;
  begin
    inherited;
    FFrontWheel := TBikeWheel.Create;
  end;

  TBikeXYZ = class( TBike)
    constructor Create;
  end;

  constructor TBikeXYZ.Create;
  begin
    inherited;
    FFrontWheel := TBikeWheelXYZ.Create;
  end;
6
ответ дан 1 December 2019 в 06:08
поделиться

В принципе - НЕЛЬЗЯ. Delphi не поддерживает множественное наследование.

Итак, оставшись с этой дилеммой, возникает вопрос: не могли бы вы реорганизовать эту библиотеку таким образом, чтобы можно было обойтись без использования интерфейса? Является ли множественное наследование главным образом функциями и методами? Если так - используйте интерфейсы. Delphi может поддерживать несколько интерфейсов в классе.

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

Извините, я не могу дать простой ответ - это просто реальность.

Марк

4
ответ дан 1 December 2019 в 06:08
поделиться

Вы можете попытаться извлечь интерфейс, скажем IFrontWheel, из TBikeWheelFront, чтобы он стал подклассом TBikeWheel, но реализовал IFrontWheel. Затем TBikeWheelXYZ наследуется от TBikeWheel, а TBikeWheelFrontXYZ наследуется от TBikeWheelXYZ и реализует IFrontWheel.

Затем вы можете определить класс TFrontwheel и дать ему те же методы, что и интерфейс, но теперь вы их реализуете. Затем TBikeWheelFront и TBikeWheelXYZ получают частный член типа TFrontwheel, а их реализации IFrontWheel просто делегируют частным методам члена.

Таким образом, у вас нет двойных реализаций.

3
ответ дан 1 December 2019 в 06:08
поделиться

Вариант предложения Брайана Фроста:

  TBikeWheel = class
  TBikeWheelXYZ = class( TBikeWheel ) 

  TBike = class
    FFrontWheel : TBikeWheel;
  protected
    function CreateWheel: TBikeWheel; virtual;
  public
    property FrontWheel : TBikeWheel
      read FrontWheel  
  end;

  TBikeABC = class( TBike)
  protected
    function CreateWheel: TBikeWheel; override;
  end;

  function TBikeABC.CreateWheel: TBikeWheel;
  begin
    result := TBikeWheel.Create;
  end;

  TBikeXYZ = class( TBike)
  protected
    function CreateWheel: TBikeWheel; override;
  end;

  function TBikeXYZ.CreateWheel: TBikeWheel;
  begin
    result := TBikeWheelXYZ.Create;
  end;
5
ответ дан 1 December 2019 в 06:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: