private против protected

Модератор: Модераторы

Ответить
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

private против protected

Сообщение Sharfik »

В Delphi(TD) была такая особенность - если переменная находилась в private класса, то она была доступна всем копиям классам, а при размещении protected только конкретной копии. Пересев на FPC не заметил тут такого эффекта, и вот сейчас не очень понимаю в чем для FPC разница между этими секциями.
stikriz11
постоялец
Сообщения: 136
Зарегистрирован: 04.09.2023 14:54:19

Сообщение stikriz11 »

Что такое копии класса?
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

stikriz11 писал(а):Что такое копии класса?
Наверное это просто "наследники класса"... ( Мда забавная опечатка "мечтают ли электро-овцы о овечке Доли ?" :wink: )
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Наоборот
private - только этот класс
protected - сам класс и его наследники
Аватара пользователя
runewalsh
энтузиаст
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Сообщение runewalsh »

И в пределах одного модуля все могут видеть всё сквозь private и protected, но в Delphi то же самое, это эквивалент «friend class» в C++. Можно выключить через strict private и strict protected, но зачем.
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Нет, я имел ввиду влияние секций на распределение памяти для объектов созданных на базе класса. Вот читаю, и ощущение что мне приснилось. Помню что была проблема в Turbo Delphi и помню как решал. Подумал что может ключ какой то был... но похоже патч на Матрицу накотили, и в этой реальности все не так...
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Sharfik писал(а):Нет, я имел ввиду влияние секций на распределение памяти для объектов созданных на базе класса.
Ась ? "Объекты на базе класса" разве это не наследники ? Или может быть это вообще "потусторонний" гибрид Object и Class ?
ЗЫ
Sharfik писал(а):но похоже патч на Матрицу накатили, и в этой реальности все не так...
О как я Вас понимаю коллега! :wink: ( Вспоминаю "нулевые версии " лазаруса где временами не работали совершенно казалось бы привычные конструкции и "абсолютно тупые" куски легаси-кода взятые из дельфи или турбо-паскаля, ау ж что творилось в "KOL + MCK" это вообще "байтораздирающее зрелище". Но кстати многое из "странного поведения" так и осталось в FPC и Лазарусе, но я просто научился избегать части "ненадежных конструкций" и старого "наследуемого кода" + немного изменил свои привычки в кодировании ) ) .
stikriz11
постоялец
Сообщения: 136
Зарегистрирован: 04.09.2023 14:54:19

Сообщение stikriz11 »

Sharfik писал(а): для объектов созданных на базе класса
Есть класс - это описание типа. Есть объект - это экземпляр класса.
protected - всегда виден в потомке.
private - не виден в потомке.
Если классы объявлены в одном модуле, то видно там все - это как френды у С++.
Есть несколько правил области видимости объекта, которые помогут Вам разобраться со способами доступа к объектам и наследования объектов:
1. Поля, свойства и методы секции public не имеют ограничений на видимость.
2. Поля, свойства и методы секции private, доступны только в методах класса и в функциях, объявленных в том же модуле, где и класс.
3. Поля, свойства и методы секции protected тоже доступны только из методов класса и функций, объявленных в модуле, но они доступны в классах, являющихся потомками, в том числе и объявленных в других модулях.
При описании потомков, Вы можете изменять область видимости методов и свойств. Можно расширять область видимости, но не сужать. Т.е. если есть свойство в секции private, вы можете сделать его public, но не наоборот.
Ответить