Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.31;
Скачать: [xml.tar.bz2];

Вниз

Выбор из 2-х реализаций абстракции.   Найти похожие ветки 

 
dummy_user   (2012-12-08 18:34) [0]

Есть базовый абстрактный класс и 2 его реализации:


type
 TSuper = class
 private
   class function Init: boolean; virtual; abstract;
 public
   function  Load(const FileName: string): boolean; virtual; abstract;
 end;

 TSuper_Version_1 = class (TSuper);
 TSuper_Version_2 = class (TSuper);



И их использование:


var
 Super: TSuper;
begin
 TSuper.Init;                 // Тут вылетает.
 Super:= TSuper.Create;
end;


Как сделать директивный выбор между этими 2-мя реализациями?
Чтобы создавая Super: TSuper не заботиться о таком: Super: TSuper_Version_1?


 
dummy_user   (2012-12-08 18:35) [1]

Т.е. поставили директиву, что используем 1-ю реализацию, а потом
спокойно создаем Super: TSuper;


 
dummy_user   (2012-12-08 18:46) [2]

Почему выбирает 2-ю версию?


$DEFINE USE_VERSION_1}

function CreateSuper: TSuper;
begin
 {$IFDEF USE_VERSION_1}
 Result:= TSuper_Version_1.Create;
 {$ENDIF}
 Result:= TSuper_Version_2.Create;
end;

procedure Dummy;
var
 Super: TSuper;
begin
 Super:= CreateSuper;
 Windows.OutputDebugString(PAnsiChar(string(Super.ClassName)));
end;



 
TUser ©   (2012-12-08 18:52) [3]

Ты вызываешь абстрактный метод - конечно вылетает.


 
dummy_user   (2012-12-08 18:53) [4]


procedure Init;
begin
 {$IFDEF USE_VERSION_1}
 TSuper_Version_1.Init;
 {$ENDIF}
 TSuper_Version_2.Init;
end;



 
Германн ©   (2012-12-08 19:17) [5]


> Почему выбирает 2-ю версию?
>

Потому что нет {$ELSE}


 
знайка   (2012-12-08 19:57) [6]

А чего сделать то надо? :)


 
DVM ©   (2012-12-08 20:36) [7]


> dummy_user   (08.12.12 18:34) 

чет я ничего не понял, то что вылетает, это одно, тебе уже написали, а вторая проблема то в чем? Сделай оба наследника под одним именем, но в данный момент действителен лишь один, что определяется директивой условной компиляции. Так что ли?


 
dummy_user   (2012-12-08 21:54) [8]

Как заменить это:

Super:= CreateSuper;

На это:

Super:= TSuper.Create;

Чтобы директивно все определялось.
Или как сделать перегрузку конструктора?


 
DVM ©   (2012-12-08 22:11) [9]


> dummy_user   (08.12.12 21:54) [8]


> Чтобы директивно все определялось.

{$IFDEF директива}
делаем одно
{$ELSE}
делаем другое
{$ENDIF}


 
dummy_user   (2012-12-09 00:37) [10]

Нет.
Я про это:


class function TSuper.CreateSuper: TSuper;
begin
 {$IF Defined(USE_VERSION_1)}
 Result:= TSuper_Version1.Create;
 {$ELSE}
 Result:= TSuper_Version2.Create;
 {$IFEND}
end;



Т.е. уже не могу создать просто сделав:
Super:= TSuper.Create;
Теперь так:
Super:= TSuper.CreateSuper;

Но мне кажется, так будет не правильно.
Нужно как-то в констукторе прописать какой класс создавать.


 
dummy_user   (2012-12-09 00:43) [11]

И еще, не знаю куда разместить инициализацию в классе TSuper.


function InitGlobal: boolean;
begin
 {$IF Defined(USE_VERSION_1)}
 Result:= TSuper_Version1.Init;
 {$ELSE}
 Result:= TSuper_Version2.Init;
 {$IFEND}
end;



Переопределить Init в TSuper?
Но этот код унаследуется и получится неправильно.

Сделать обычную процедуру как тут?
Но не хочется отделять логику TSuper-объектов в отдельные функции.

Создать TSuper.InitGlobal?
Выглядит как ерунда полнейшая.

Что делать, что выбрать?


 
silver ©   (2012-12-09 00:48) [12]

вопрос странный - делай, как удобно тебе
я директивами из платной бесплатную версию делаю, например



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.069 c
15-1354600784
O'ShinW
2012-12-04 09:59
2013.03.31
дольше ли будет запрос(MSSQL)?


15-1354653003
Юрий
2012-12-05 00:30
2013.03.31
С днем рождения ! 5 декабря 2012 среда


15-1354306589
Dennis I. Komarov
2012-12-01 00:16
2013.03.31
Зима пришла!


2-1347384231
Писатель
2012-09-11 21:23
2013.03.31
Масштабирование BMP


2-1286953967
Evgeney
2010-10-13 11:12
2013.03.31
Вставка изображения в BLOB поле





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский