Форум: "Прочее";
Текущий архив: 2008.08.03;
Скачать: [xml.tar.bz2];
ВнизИщу работу Найти похожие ветки
← →
isasa © (2008-06-16 15:15) [200]Ega23 © (16.06.08 14:57) [194]
Ошибок - нет. Кривизна - есть.
Ну а куда ты поместишь инициализацию экземпляра формы, чтобы он был при Создать форму.
Ну Борланд придумал так, плюс еще..
Application.CreateForm(TForm1, Form1);
Компилируй и юзай. Что неправильно. Да "пложой стиль", не по правилам(сейчас oxffff © меня сожрет). Не нравится исправляй.
Ответ в том, исправит ли рефакторинг(или предложаит исправить Form1 на Self) ? :)
← →
Ega23 © (2008-06-16 15:15) [201]
> В студию. Кратко.
Сергей, ну сколько можно уже, а? Ну не должен какой-то класс знать что-то о каком-то конкретном экземпляре этого же класса.
← →
Плохиш © (2008-06-16 15:16) [202]
> oxffff © (16.06.08 15:09) [199]
У это вам неинтересно
>>isasa © (16.06.08 12:10) [147]
>>>oxffff © (16.06.08 12:06) [144]
>>>Это про какие такие вы принципы нарушения ООП говорите.
>>Пожелание о том, что код метода класса не должен ничего "знать" о >>конкретном экземпляре этого класса.
вы же хотите конкретную цитату из единственной книжки, которую вы якобы осилили. Как здесь говорят "детский сад в другом месте".
← →
oxffff © (2008-06-16 15:24) [203]
> Ega23 © (16.06.08 15:15) [201]
>
> > В студию. Кратко.
>
>
> Сергей, ну сколько можно уже, а? Ну не должен какой-то класс
> знать что-то о каком-то конкретном экземпляре этого же класса.
>
Ребята я на полном серьезе повторяю.
Что ваши слова должны быть потверждены.
Если вы утверждаете о каком то нарушении ООП, а частности реализации ООП Delphi. Тогда сформулируйте правило, которое нарушено.
Покажите где нарушена инкапсуляция.
Если я использую тип в модуле где он объявлен, то нарушения нет.
Все в рамках правил Delphi.
Поэтому нарушение сокрытия здесь нет.
Поэтому твоя формулировка
>Ну не должен какой-то класс знать что-то о каком-то конкретном >экземпляре этого же класса.
более чем странная.
Класс не знает, а использует экземпляр класса(в данном случае экземпляр себя).
← →
isasa © (2008-06-16 15:25) [204]Плохиш © (16.06.08 15:16) [202]
вы же хотите конкретную цитату из единственной книжки, которую вы якобы осилили. Как здесь говорят "детский сад в другом месте".
Ну это лучше, чем с загадочным видом нести ахинею, или глупости.
← →
oxffff © (2008-06-16 15:26) [205]
> Компилируй и юзай. Что неправильно. Да "пложой стиль", не
> по правилам(сейчас oxffff © меня сожрет). Не нравится исправляй.
>
Да ну что вы. Я довольно Friendly человек.
← →
DVM © (2008-06-16 15:30) [206]
> Плохиш © (16.06.08 15:16) [202]
>
>
> вы же хотите конкретную цитату из единственной книжки, которую
> вы якобы осилили. Как здесь говорят "детский сад в другом
> месте".
А вам не кажется, что кроме оскорблений в адрес собеседников Вы ничего путного до сих пор так не сказали? Перечитайте все свои посты.
← →
clickmaker © (2008-06-16 15:31) [207]> Класс не знает, а использует экземпляр класса(в данном случае
> экземпляр себя).
если себя, то почему не Self?
Если "типа универсальность", то почему не GetFormToSetCaption().Caption := ... ?
← →
isasa © (2008-06-16 15:31) [208]oxffff © (16.06.08 15:26) [205]
Да ну что вы. Я довольно Friendly человек.
В этом вопросе я целиком на вашей стороне. Только я использую оговорку, Дельфи не "польностью" следует "хорошему тону" ООП.
← →
oxffff © (2008-06-16 15:38) [209]
> Плохиш © (16.06.08 15:16) [202]
>
> > oxffff © (16.06.08 15:09) [199]
>
> У это вам неинтересно
>
> >>isasa © (16.06.08 12:10) [147]
> >>>oxffff © (16.06.08 12:06) [144]
>
> >>>Это про какие такие вы принципы нарушения ООП говорите.
>
>
> >>Пожелание о том, что код метода класса не должен ничего
> "знать" о >>конкретном экземпляре этого класса.
>
> вы же хотите конкретную цитату из единственной книжки, которую
> вы якобы осилили. Как здесь говорят "детский сад в другом
> месте".
Ну и долго вы будете отвечать на вопрос "сам дурак"?
Использование в реализации ссылки на экзепляр самого себя не противоречит ООП и бывает очень востребовано.
Например У вас Есть абстрактный класс
type
TAbstractStreamObject=class
public
function Read(...):integer;virtual;
function write(...):integer;virtual;
end;
function InitializeGlobalStream(obj:TAbstractStreamObject):integer;
implementation
var GlobalIntercept:TAbstractStreamObject;
function TAbstractStreamObject.Read(..)....
begin
if assigned(GlobalIntercept) then result:=GlobalIntercept.read(...)
else...
end;
function TAbstractStreamObject.Write(..)....
begin
if assigned(GlobalIntercept) then result:=GlobalIntercept.Write(...)
else...
end;
Таким образом вы можете установить\менять перехватчик runtime.
Причем передавать в конструктор его не нужно (экономим передачу и место в памяти). Он разделяется всеми экземплярами.
← →
oxffff © (2008-06-16 15:39) [210]
> clickmaker © (16.06.08 15:31) [207]
> > Класс не знает, а использует экземпляр класса(в данном
> случае
> > экземпляр себя).
>
> если себя, то почему не Self?
> Если "типа универсальность", то почему не GetFormToSetCaption().
> Caption := ... ?
В данном случае экземпляр себя как типа, либо производного.
см. пример [209].
← →
Ega23 © (2008-06-16 15:41) [211]
> Класс не знает, а использует экземпляр класса(в данном случае
> экземпляр себя).
Блин, ну есть же Self для этого!!!
чем плох такой код:if CheckBox1.Checked=True then
begin
CheckBox1.Checked := False;
end
else
begin
if CheckBox1.Checke=False then
begin
CheckBox1.Checked := True;
end
else
raise Exception.Create("Unknown boolean value!");
end;
← →
b z (2008-06-16 15:42) [212]
> Unknown boolean valueЗамечено, что программисты зачастую пишут функции, которые возвращают ложь (return false по-басурмански). Негоже это. Коли приметишь, такое непотребство, немедленно учини разбирательство и потребуй, чтобы такого боле не повторялось. А коли программисты начнут нести околесицу про булевы функции и необходимость возвращения двух значений, осади их и скажи, что для двух значений ложь не нужна. Можно же взять правду и горькую правду. Пущай везде в своем коде заменят ложь на горькую правду. Только так можно получить по настоящему благодатный код.
← →
oxffff © (2008-06-16 15:42) [213]
> isasa © (16.06.08 15:31) [208]
> oxffff © (16.06.08 15:26) [205]
>
> Да ну что вы. Я довольно Friendly человек.
>
> В этом вопросе я целиком на вашей стороне. Только я использую
> оговорку, Дельфи не "польностью" следует "хорошему тону"
> ООП.
На сколько я понял вы хотели сказать наверно не ООП,
а возможное нарушение типа за счет Untyped var.
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
← →
oxffff © (2008-06-16 15:47) [214]
> Ega23 © (16.06.08 15:41) [211]
>
> > Класс не знает, а использует экземпляр класса(в данном
> случае
> > экземпляр себя).
Что с примером?
Повторю еще раз.
Я имел ввиду использование экземпляра себя как типа (т.е. экземпляра этого типа, так и производного типа)
см. [209]
← →
clickmaker © (2008-06-16 15:49) [215]> function TAbstractStreamObject.Read(..)....
> begin
> if assigned(GlobalIntercept) then result:=GlobalIntercept.read(...)
эээ... не понял без стакана.
Рекурсия же получается? Или 2 разных объекта: тот, откуда вызывается GlobalIntercept.read и собственно сам GlobalIntercept?
← →
oxffff © (2008-06-16 15:54) [216]
> clickmaker © (16.06.08 15:49) [215]
type
TAbstractStreamObject=class
public
function Read(...):integer;virtual;
function write(...):integer;virtual;
end;
TSomeClientStreamObject=class(TAbstractStreamObject)
function Read(...):integer;override;
begin
.........
inherited;
end;
function write(...):integer;virtual;
begin
.........
inherited;
end;
end;
function InitializeGlobalStream(obj:TAbstractStreamObject):integer;
implementation
var GlobalIntercept:TAbstractStreamObject;
function TAbstractStreamObject.Read(..)....
begin
if assigned(GlobalIntercept) then result:=GlobalIntercept.read(...)
else...
end;
function TAbstractStreamObject.Write(..)....
begin
if assigned(GlobalIntercept) then result:=GlobalIntercept.Write(...)
else...
end;
Другой модуль.
TIntercepttreamObjectA=class(TAbstractStreamObject)
function Read(...):integer;override;
begin
.........
// inherited;
end;
function write(...):integer;virtual;
begin
.........
// inherited;
end;
initialization
InitializeGlobalStream(TIntercepttreamObjectA.create(..));
← →
Ega23 © (2008-06-16 15:54) [217]
> Что с примером?
>
> Повторю еще раз.
> Я имел ввиду использование экземпляра себя как типа (т.е.
> экземпляра этого типа, так и производного типа)
> см. [209]
Честно говоря, я не понял примера. Покажи код InitializeGlobalStream, может понятней станет.
← →
clickmaker © (2008-06-16 15:57) [218]> код InitializeGlobalStream
procedure InitializeGlobalStream(AStream: TAbstractStreamObject)
begin
GlobalIntercept := AStream;
end;
:)
← →
oxffff © (2008-06-16 15:57) [219]function InitializeGlobalStream(obj:TAbstractStreamObject):integer;
begin
GlobalIntercept:=obj;
end;
← →
oxffff © (2008-06-16 15:58) [220]
> clickmaker © (16.06.08 15:57) [218]
> > код InitializeGlobalStream
>
> procedure InitializeGlobalStream(AStream: TAbstractStreamObject)
> begin
> GlobalIntercept := AStream;
> end;
>
> :)
Теперь вы согласны, что выгода есть?
← →
clickmaker © (2008-06-16 16:03) [221]цепочка вызовов
GlobalIntercept <- объект типа TIntercepttreamObjectA
GlobalIntercept.read()
TAbstractStreamObject.read()
GlobalIntercept <> nil ? yes!
GlobalIntercept.read()
и т.д.
или мне срочно надо похмеляццо, или тут рекурсия. Это вообще рабочий код?
← →
oxffff © (2008-06-16 16:06) [222]
> clickmaker © (16.06.08 16:03) [221]
> цепочка вызовов
> GlobalIntercept <- объект типа TIntercepttreamObjectA
> GlobalIntercept.read()
> TAbstractStreamObject.read()
> GlobalIntercept <> nil ? yes!
> GlobalIntercept.read()
> и т.д.
>
> или мне срочно надо похмеляццо, или тут рекурсия. Это вообще
> рабочий код?
Вызов не перехватчиков приведет к вызову перехватчика.
А у перехватчика нет вызова самого себя поскольку inherited закомментирован.
Я же пометил жирным inherited в одном случае и закоменченный inherited в другом.
← →
Ega23 © (2008-06-16 16:07) [223]Какой-то "недо-singleton" получился...
Ну да ладно. В данном конкретном примере - предположим что именно такой функционал нужен. Решение как решение.
Но есть одно "но": объявление переменной выполнено в секции implementation, а не interface.
← →
oxffff © (2008-06-16 16:10) [224]>"недо-singleton"
Это не синглетон. У синглетона другая задача.
> Но есть одно "но": объявление переменной выполнено в секции
> implementation, а не interface.
Объяви в interface. Нет проблем.
← →
Ega23 © (2008-06-16 16:19) [225]
> Объяви в interface. Нет проблем.
Проблем есть. Т.к. рано или поздно это дело будет использовано кем-то другим.
Если так подходить, то ни private ни protected нафиг не нужны - пиши всё в public и нет проблем. :)
← →
Ega23 © (2008-06-16 16:20) [226]
> Это не синглетон. У синглетона другая задача.
Да я вижу. Нечто похожее, но не оно - у тебя в рантайм менять можно.
← →
oxffff © (2008-06-16 16:24) [227]
> Ega23 © (16.06.08 16:19) [225]
>
> > Объяви в interface. Нет проблем.
>
>
> Проблем есть. Т.к. рано или поздно это дело будет использовано
> кем-то другим.
> Если так подходить, то ни private ни protected нафиг не
> нужны - пиши всё в public и нет проблем. :)
Проблема выбора interface или implementation отношения к ООП не имеет. Это выбор разработчика предоставить доступ или вообще полностью скрыть.
← →
oxffff © (2008-06-16 16:26) [228]
> Ega23 © (16.06.08 16:20) [226]
>
> > Это не синглетон. У синглетона другая задача.
>
>
> Да я вижу. Нечто похожее, но не оно - у тебя в рантайм менять
> можно.
У синглетона назначение гарантировать существование не более одного экземпляра. А здесь просто использование shared объекта.
← →
Ega23 © (2008-06-16 16:28) [229]
> У синглетона назначение гарантировать существование не более
> одного экземпляра. А здесь просто использование shared объекта.
Да вижу я, не надо объяснять. Я просто в [223] смайлик забыл поставить.. :)
← →
isasa © (2008-06-16 16:30) [230]oxffff © (16.06.08 16:10) [224]
:)
Я бы все таки не смешивал идеал и способы его конкретной реализации.
Есть краски, а есть картины.
Идеал, он в общем то, недостижим..
← →
oxffff © (2008-06-16 16:35) [231]
> isasa © (16.06.08 16:30) [230]
Однако я так и не услышал нарушение принципов ООП от других участников в примере который мы(все) уже раздули до мамонта.
← →
Игорь Шевченко © (2008-06-16 18:16) [232]Дабы флейм не стихал:
Где в этом коде ошибка?
procedure TForm1.ButtonClick (Sender: TObject);
begin
Form1.Caption := "Blah";
Form2.Caption := "Foo";
end;
← →
Kostafey © (2008-06-16 18:24) [233]Ну коли
> Дабы флейм не стихал:
Повторюсь, что код не компилируется :)
procedure TFоrm1.ButtоnCliсk (Sеnder: TОbject);
begin
Fоrm1.Caption := "Blah";
Fоrm2.Caption := "Foo";
end;
← →
McSimm © (2008-06-16 18:26) [234]
> Игорь Шевченко © (16.06.08 18:16) [232]
>
> Дабы флейм не стихал:
>
> Где в этом коде ошибка?
Должно быть TForm1.Button1Click
:)
← →
Virgo_Style © (2008-06-16 18:28) [235]
procedure TFоrm1.ButtоnCliсk (Sеnder: TОbject);
Form1.Caption := "Alpha";
Self.Caption = "Bravo";
Caption = "Charlie";
end;
← →
Virgo_Style © (2008-06-16 18:29) [236]Virgo_Style © (16.06.08 18:28) [235]
Ну вот, двоеточия потерял. Так лучше:procedure TFоrm1.ButtоnCliсk (Sеnder: TОbject);
Form1.Caption := "Alpha";
Self.Caption := "Bravo";
Caption := "Charlie";
end;
← →
Ega23 © (2008-06-16 18:39) [237]
> Virgo_Style © (16.06.08 18:28) [235]begin
отсутствует.
А кому будешь Delta, Easy, Foxtrot и Golf раздавать?
← →
Anatoly Podgoretsky © (2008-06-16 19:30) [238]> Ega23 (16.06.2008 18:39:57) [237]
Из этих четырех ников вроде только один правильный.
← →
Virgo_Style © (2008-06-16 20:38) [239]Ega23 © (16.06.08 18:39) [237]
begin отсутствует.
Торможу. Все-таки возможность редактирования сообщений была бы иногда очень кстати...
> А кому будешь Delta, Easy, Foxtrot и Golf раздавать?
Землю крестьянам, власть рабочим, Фокстрот танцорам, Гольф игрокам (или автомобилистам?)... А вот с первыми двумя надо думать.
← →
DVM © (2008-06-16 22:05) [240]
procedure TForm1.Button1Click(Sender: TObject);
begin
Captiоn := "Где тут ошибка"?
end;
А вот этот код не компилится, так как тут ошибка. Где она?
Страницы: 1 2 3 4 5 6 7 вся ветка
Форум: "Прочее";
Текущий архив: 2008.08.03;
Скачать: [xml.tar.bz2];
Память: 1.07 MB
Время: 0.034 c