Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
6-31383
LOX
2003-05-03 12:29
2003.07.10
А IP у компа всегда одинаковый?


6-31391
Kremen
2003-05-03 12:59
2003.07.10
Ошибка при использовании снифера


7-31529
GIMLI
2003-04-20 13:53
2003.07.10
имя Материнской платы


14-31473
Dimkin
2003-06-24 11:14
2003.07.10
А кто работа с Oracle? Есть вопросик ..


1-31220
jack128
2003-06-29 00:36
2003.07.10
MDI интерфейс





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский