Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
Enthusiast
3 / 3 / 2
Регистрация: 12.10.2012
Сообщений: 21
1

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

13.12.2012, 13:40. Просмотров 2842. Ответов 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
Ответы с готовыми решениями:

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

Как задать область видимости?
Как задать область видимости для объектов в Delphi? Может есть модификаторы...

Вопрос про область видимости
День, добрый. В С++ можно использовать идентификатор некоторой области...

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

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

6
angstrom
2471 / 1847 / 242
Регистрация: 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
26509 / 17802 / 7044
Регистрация: 22.10.2011
Сообщений: 31,329
Записей в блоге: 6
13.12.2012, 15:01 3
Цитата Сообщение от angstrom Посмотреть сообщение
доступ всё равно не получишь.
Правда? А ты попробуй, опиши в одном модуле TForm1 и само обращение к переменной Form1. И посмотри, как "не получишь". Плевать Дельфи хотела на спецификаторы доступа, если описание класса и попытка его использования находятся в одном модуле. Ты даже к приватной V1 можешь обратиться, что вообще ни в какие ворота не лезет.

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

по хорошему классы должны лежать в отдельном модуле и тогда их private методы не видны
0
Enthusiast
3 / 3 / 2
Регистрация: 12.10.2012
Сообщений: 21
13.12.2012, 15:25  [ТС] 5
UI, то есть выходит, что эти секции работают не совсем так, как надо?
Действительно, обращение происходит без всяких проблем, хм.
0
DaMortum
244 / 147 / 31
Регистрация: 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
26509 / 17802 / 7044
Регистрация: 22.10.2011
Сообщений: 31,329
Записей в блоге: 6
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
Как изменить приоритет видимости TEdit, чтобы при накладывании поверх него...


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

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

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