Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
Enthusiast
3 / 3 / 1
Регистрация: 12.10.2012
Сообщений: 21
#1

Область видимости элементов класса - Delphi

13.12.2012, 13:40. Просмотров 2718. Ответов 6
Метки нет (Все метки)

Здравствуйте. В книге, в главе посвященной классам приводится следующий пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Unit Unit1;
interface
Uses Controls, Forms;
type
    TForm1 = class (TForm)
        Button1: TButton;
    private
        v1: Integer;
    protected
        Procedure P1;
    public
        Procedure P2;
 
var
    Form1: TForm1
begin
    Form1.Button1.Color := clBtnFace;  // Так можно
    Form1.v1 := 0;                  // Так можно
    Form1.P1;                           // Так нельзя!
    Form1.P2;                           // Так можно
end.
А теперь описания областей видимости:
Секция private сужает область видимости до минимума: закрытые элементы описания доступны только внутри методов данного класса и подпрограммах, находящихся в том же модуле, где описан класс.
Секция protected доступна только методам самого класса, а также любым его потомкам, независимо от того, находятся ли они в том же модуле или нет.
Секция public не накладывает ограничений на область видимости перечисляемых в ней элементов описания класса.
А теперь вопрос: почему нельзя вызвать процедуру P1? Опечатка? В данном издании достаточно много ошибок.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.12.2012, 13:40
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Область видимости элементов класса (Delphi):

Область видимости в библиотеке (dll) - Delphi
Здравствуйте, форумчане, такой вопрос: есть библиотека, состоящая из нескольких модулей, и есть процедура, которую я хочу использовать...

Вопрос про область видимости - Delphi
День, добрый. В С++ можно использовать идентификатор некоторой области видимости, без "высвечивания" всех идентификаторов этой области: ...

USES unit и область видимости переменной - Delphi
Привет. В разделе INTERFACE есть USES и там подключатся всякие модули. Недавно увидел что некоторые пишут USES в раздел...

Как задать область видимости? - Delphi
Как задать область видимости для объектов в Delphi? Может есть модификаторы доступа? Мне нужно, чтобы переменная x была доступна из любой...

Нет видимости элементов компонента между классами - Delphi
Добрый день! Создаю компонент со свойствами-множествами (unit MyComponent) и редактором свойств (unit PropertyEditor) по такой схеме: ...

Свойства элементов класса - Delphi
Добрый день. Я прочитал много литературы но так и не нашел, как описать свойства элементов класса. Есть класс: type TField =...

6
angstrom
2470 / 1846 / 66
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
13.12.2012, 14:21 #2
Но ведь сказано, доступно методам самого класса, а тут
Delphi
1
2
3
4
5
6
begin
    Form1.Button1.Color := clBtnFace;  // Так можно
    Form1.v1 := 0;                  // Так можно
    Form1.P1;                           // Так нельзя!
    Form1.P2;                           // Так можно
end.
неизвестно кто пытается получить доступ к закрытому разделу. И неважно, что указана ссылка на Form1, доступ всё равно не получишь.
1
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25539 / 17092 / 5419
Регистрация: 22.10.2011
Сообщений: 30,267
Записей в блоге: 7
13.12.2012, 15:01 #3
Цитата Сообщение от angstrom Посмотреть сообщение
доступ всё равно не получишь.
Правда? А ты попробуй, опиши в одном модуле TForm1 и само обращение к переменной Form1. И посмотри, как "не получишь". Плевать Дельфи хотела на спецификаторы доступа, если описание класса и попытка его использования находятся в одном модуле. Ты даже к приватной V1 можешь обратиться, что вообще ни в какие ворота не лезет.

На новых версиях Дельфи хотя бы strict private/strict protected спасает...
1
Alex_pac
1290 / 696 / 8
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
13.12.2012, 15:12 #4
Плевать Дельфи хотела на спецификаторы доступа, если описание класса и попытка его использования находятся в одном модуле.
это вполне нормальное поведение ибо дает гибкость для использования функционала другими классами внутри этого модуля без каких либо ограничений

по хорошему классы должны лежать в отдельном модуле и тогда их private методы не видны
0
Enthusiast
3 / 3 / 1
Регистрация: 12.10.2012
Сообщений: 21
13.12.2012, 15:25  [ТС] #5
UI, то есть выходит, что эти секции работают не совсем так, как надо?
Действительно, обращение происходит без всяких проблем, хм.
0
DaMortum
243 / 146 / 1
Регистрация: 07.10.2012
Сообщений: 401
13.12.2012, 15:32 #6
private
Accessible only to code in the unit where the class is defined.

protected
Accessible to code in the units where the class and its descendants are defined.
Как написано в файле помощи, так и работают.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25539 / 17092 / 5419
Регистрация: 22.10.2011
Сообщений: 30,267
Записей в блоге: 7
13.12.2012, 15:36 #7
Цитата Сообщение от Alex_pac Посмотреть сообщение
это вполне нормальное поведение
Это совсем не нормальное поведение. Это просто такая багофича Дельфи, править которую, как всегда, никто не собирается. Потому что ее исправление приведет к краху большинства прежних проектов.

Цитата Сообщение от Alex_pac Посмотреть сообщение
дает гибкость для использования функционала другими классами внутри этого модуля без каких либо ограничений
То есть, свойства кто-то запрещает использовать внутри того же модуля? Какие ограничения? Ограничения должны распространяться на всех, а не по принципу "кто оказался ближе, тот и получает доступ". После работы с языками, где так и происходит, поведение Дельфи кажется не очень вменяемым.

Цитата Сообщение от Alex_pac Посмотреть сообщение
по хорошему классы должны лежать в отдельном модуле и тогда их private методы не видны
Зачем это мне несколько классов, которые занимаются одним общим делом, разбрасывать по разным модулям? Я хочу, чтобы они были в одном модуле. Но чтобы ограничения доступа распространялись и на них тоже. Это что, запретное желание?
0
13.12.2012, 15:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 15:36
Привет! Вот еще темы с ответами:

Приоритет видимости TEdit - Delphi
Как изменить приоритет видимости TEdit, чтобы при накладывании поверх него TListBox приоритет был за TListBox. Нужно для динамически...

О фильтрах и видимости объектов. - Delphi
Всем привет! Я только начинаю изучать Делфи. И у меня проблема в следующем. Я создал в своём проекте меню и из всплывающего меню,...

Создание видимости затмений по датам - Delphi
есть программа созданная для обзора солнечной системы нужно как то сделать так чтобы вводить дату и видеть затмения

Создать стек сплошным представлением и продемонстрировать методы класса для стека из 15 элементов - Delphi
нужно создать стек сплошным представлением и продемонстрировать методы класса для стека из 15ти элементов. Не могу понять как описать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru