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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка конструкторов, концептуальный вопрос 
:(
    Опции темы
stab
Дата 2.6.2007, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



требуется разработать класс, объекты которого могли бы создаваться только с помощью двух конструкторов с различными типами параметров.  на первый взгляд всё просто:

Код

TMyObject = class
public
  constructor Create(param: TParam1); overload;
  constructor Create(param: TParam2); overload;
end;


но не тут-то было, в наследство получаем конструктор без параметров от TObject, т.к. используется перегрузка (overload). по дизайну, состояния по умолчанию у объекта нет, т.е. конструктора без параметров быть не должно. от него как-то возможно избавиться и сохранить название Create для обоих конструкторов?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Alexeis
Дата 2.6.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stab
Дата 3.6.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



.. а наследование нужно.

странный однако дизайн языка.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Alexeis
Дата 3.6.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



Получилось!

Код

 type
  TTmpObj = class
    constructor create(i : integer);  virtual;
  end;

  TInhObj = class(TTmpObj)
    constructor create(i : integer); overload;
    constructor create(i : char);    overload;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

  constructor TTmpObj.create(i : integer);
  Begin

  end;

  constructor TInhObj.create(i : integer);
  Begin

  end;

  constructor TInhObj.create(i : char);
  Begin

  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  c : TInhObj;
begin
  c := TInhObj.create;
end;



Вот так не удается создать экземпляр TInhObj.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
stab
Дата 3.6.2007, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



к сожалению реализацию базового класса я не могу менять, а конструктор там не виртуальный.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Alexeis
Дата 3.6.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



cully, так нужно просто сделать 2 наследника. Первый временный, а второй уже такой как нужно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
skyboy
Дата 3.6.2007, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: нет
Всего: 260



мотивы определяют путь:
а) надо запретить вызов конструктора без параметров:
  • Генерировать исключение в конструкторе без параметров(заодно объявить его виртуальным)
  • Не использовать вызов конструктора без параметров smile
  • указать для всех параметров одного из перегруженных конструкторов значения по умолчанию
б) надо подавить ругань компилятора на отличия сигнатур в виртуальных методах потомка
  • объявить соответствующие конструкторы, как reintroduce;(ну, и  virtual;)

PM MAIL   Вверх
stab
Дата 4.6.2007, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 1
Всего: 48



придётся остановиться на варианте "Не использовать вызов конструктора без параметров"  smile 


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
pseud
Дата 4.6.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



cully, 

Вариант1
Код

type
  TMyObject = class
  public
    constructor Create(param: Integer); 
  end;

Все супер - доступен только наш новый конструктор.

Вариант2
Код

type
  TMyObject = class
  public
    constructor Create(param: Integer); overload;
    constructor Create(param: string); overload;      
  end;

Лажа - во вновь создаваемом объекте доступны 3 конструктора (+ просто Create);

--------------------------------------
Предлагаю Вариант 3
--------------------------------------
Код

type
  TMyObject = class
  public
    constructor Create(param: Integer); 
    constructor CreateString(param: string);
  end;

Достпуно 2 конструктора, но под разными именами.



Это сообщение отредактировал(а) pseud - 4.6.2007, 11:26


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


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

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