Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
ВнизПоменять область видимости метода Найти похожие ветки
← →
Bless (2003-06-26 10:59) [0]Всем привет!
Сразу извиняюсь за возможно глупый вопрос.
Можно ли private-метод класса-предка сделать public в классе-потомке(для свойств же можно)?
Можно, конечно, его перекрыть
class TMyClass
...
public
procedure Metod;
...
end;
procedure Metod;
begin
inherited Metod;
end
но выглядит как-то косолаповато.
← →
Юрий Федоров (2003-06-26 11:01) [1]Вроде метод нельзя, можно только свойство
← →
Skier (2003-06-26 11:02) [2]>Bless (26.06.03 10:59)
> Можно ли private-метод класса-предка сделать public в классе-потомке
Можно, если эти классы в одном модуле, в противном
случае выноси методы в предке в секцию protected
← →
Skier (2003-06-26 11:05) [3]Shit. Поторопился ! Мои извинения...
← →
Bless (2003-06-27 10:01) [4]Я перепутал, метод не private, а protected.
>Skier © (26.06.03 11:05)
>Shit. Поторопился ! Мои извинения...
То есть нельзя сделать public?
← →
Zemal (2003-06-27 11:07) [5]Можно выкрутиться таким макаром и получить доступ ко всем закрытым методам объекта:
type
TFakeField = class(TField);
...
TFakeField(FieldByName("Buy")).SetDataType(ftCurrency);
{
мне позарез нужно было изменить тип данных у поля, но свойство DataType оказывается только для чтения, а функция SetDateType описана в разделе protected... :(( как известно к функциям из этого раздела можно получить доступ только из объекта класса потомка, описанного в этом же юните(!!!)... вот я и описал фиктивный класс и использовал приведение типов :))... в результате получил доступ ко всем сокрытым методам... только сам понимаешь чем это может обернуться, так что используй с умом :))
}
...
Если это поможет "отцу русской демократии", то юзай все сокрытые методы как хочешь и где хочешь, но не забывай что это не по правилам хорошего тона программирования. Я использую это редко, только в случаях когда другое решение более трудоёмко и повлечёт за собой кучу глупого кода :)).
← →
Юрий Федоров (2003-06-27 11:13) [6]>>Bless (27.06.03 10:01)
Можно как ты написал. Другое дело, что какая-то странная ситуация, наверно что-то неправильно спроектировано, отсюда и "косолапость"
← →
Zemal (2003-06-27 11:14) [7]Может я не в тему??? :)) С утра ещё не проснулся :)).
← →
Семен Сорокин (2003-06-27 11:17) [8]Zemal © (27.06.03 11:07)
ко всем закрытым методам объекта
уточнение - ко всем protected методам объекта
← →
Zemal (2003-06-27 11:21) [9]Сёма Сорокин >> ты прав как никогда :)) спасибо за поправку :)) только мне кажется будут доступны и private тоже :)), т.е. не останется недоступных методов :)). Может я ошибаюсь?
← →
Семен Сорокин (2003-06-27 11:25) [10]Zemal © (27.06.03 11:21)
если твои изменения будут находиться в модуле, где объявлен класс TField, то тогда будут доступны и private- методы, иначе - только protected
← →
Zemal (2003-06-27 11:37) [11]Семён, ты посмотри и протестируй мой примерчик :)). Сам увидишь что доступны ВСЕ методы, т.к. класс получается вроде бы как объявленным в ЭТОМ(!!!) юните :)), т.к. используется приведение к классу:
TFakeField(FieldByName("Buy"))
← →
Семен Сорокин (2003-06-27 11:51) [12]Zemal © (27.06.03 11:37)
признаю, неправ :))
← →
Zemal (2003-06-27 12:04) [13]Семён >> Теперь будешь знать как обуть все ограничения и обойти все области видимости :))
← →
Юрий Федоров (2003-06-27 12:11) [14]>>Zemal
Ты хочешь сказать, что
TFakeField(FieldByName("Buy")).FFieldName:="";
откомпилируется?
Если так, то полные чудеса творятся.
Если конечно мы не вносим исправления в модуль DB.pas
← →
Семен Сорокин (2003-06-27 12:17) [15]Юрий Федоров © (27.06.03 12:11)
точно, а я смотрел в Evaluate/Modify
← →
Семен Сорокин (2003-06-27 12:18) [16]знал же, что сто-то здесь не так :)))
← →
Zemal (2003-06-27 12:21) [17]А чего не так??? Всё так :)).
Юрий Федоров © (27.06.03 12:11)
Именно откомпилируется :)). И будет работать :)). Проверь :)).
← →
Юрий Федоров (2003-06-27 12:23) [18]>>Zemal © (27.06.03 12:21)
Ну так я же проверил прежде чем писать :-)
← →
Zemal (2003-06-27 12:28) [19]Эта фишка используется часто программистами Борланд в некоторых стандартных юнитах с описаниями некоторых базовых классов :)). Неужели не встречали??? Только они это намеренно не документируют, и более того, тщательно скрывают :)). И понятно для чего :)). Но сами активно используют :)). Во гады!!! Да???
← →
Семен Сорокин (2003-06-27 12:28) [20]2Zemal
воду взбаламутил, может тебе все-таки доспать еще надо Zemal © (27.06.03 11:14) :)))
← →
Семен Сорокин (2003-06-27 12:30) [21]Zemal © (27.06.03 12:28)
может директивку какую надо, чтобы откомпилировалось?
← →
Юрий Федоров (2003-06-27 12:36) [22]>>Zemal
Ты путаешь доступ к protected и к private.
Для чего, по твоему, пишут такие статьи :
http://www.delphimaster.ru/articles/callprivate/index.html
← →
Zemal (2003-06-27 12:53) [23]Семен Сорокин >> аха :)) нужно доспать :)) но недают, понимаешь...
← →
Zemal (2003-06-27 12:56) [24]Юрий Федоров >> Ты хочешь сказать что методы объявленные в protected доступны небудут???
← →
Семен Сорокин (2003-06-27 12:56) [25]Zemal © (27.06.03 12:53)
так все же вот этот код компилируется?
TFakeField(FieldByName("Buy")).FFieldName:="";
← →
Юрий Федоров (2003-06-27 13:00) [26]>>Zemal © (27.06.03 12:56)
Издеваешься ? Наоборот :-)
Не, точно издеваешься
← →
Семен Сорокин (2003-06-27 13:00) [27]Юрий Федоров © (27.06.03 13:00)
он не выспался :))
← →
Zemal (2003-06-27 13:00) [28]Семен Сорокин >> Скомпилируется :))
Юрий Федоров >> А ведь точно... ты прав... всё что объявлено в protected недоступно :((... только private... я торможу, блин... надо лучше спать, а не в Unreal по ночам гонять :))
← →
Семен Сорокин (2003-06-27 13:02) [29]Zemal © (27.06.03 13:00)
может наоборот?
← →
Zemal (2003-06-27 13:11) [30]Семен Сорокин >> Блин, ну наоборот!!! Да какая разница??? Пусть будет так как есть :))... мда-а-а-а... чувствую напишу я сегодня новый проект... как бы я чего не запорол... ещё Ораклу щас подвешу, или ещё хуже до бэкапа дело дойдёт :)) тьфу-тьфу-тьфу
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.10;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c