Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создание свойства класса. / 7 сообщений из 7, страница 1 из 1
26.07.2005, 17:57:47
    #33185637
Создание свойства класса.
При создании свойства класса я могу задать для свойства Public,Protected и Hidden. Все эти значения относятся к видимости свойства для дочерних классов и для программы. Так почему при задании Protected класс не видит свойства?

У меня класс контейнер содержит кнопку. Обращение из init кнопки
aa = This.parent.свойство
...
Рейтинг: 0 / 0
26.07.2005, 19:02:02
    #33185741
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание свойства класса.
Выложи примерчик своего класса. Заодно укажи версию FoxPro.
...
Рейтинг: 0 / 0
26.07.2005, 20:01:28
    #33185792
Создание свойства класса.
У меня 7 фокс. Сделал пример.
...
Рейтинг: 0 / 0
26.07.2005, 23:12:34
    #33185884
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание свойства класса.
Перенеси код присвоения значения свойству из INIT-вложенного объекта в INIT самого контейнера.

Похоже на то, что защищенные свойства и методы (PROTECTED или HIDEN) не видны также и из member-членов класса-контейнера. Т.е. обращение к ним возможны только непосредственно из методов самого класса-контейнера.

В твоем примере, если хочешь сделать Protected-свойство, хранящее реквизит кнопки, то придется делать класс кнопки. Без контейнера. Затем этот класс кнопки положишь в класс-контейнер, если необходимо.
...
Рейтинг: 0 / 0
26.07.2005, 23:17:48
    #33185891
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание свойства класса.
Hi И_Я_хочу_Знать!

> Все эти значения относятся к видимости свойства для дочерних классов и для
> программы.

нет, ТОЛЬКО для дочерних классов.

> Так почему при задании Protected класс не видит свойства?

Потому что форма с кнопкой - это не есть наследник класса кнопки (даже
member-объект - кнопка лежащая на этой форме не есть класс-наследник!). Вот
если бы ты сделал подкласс от кнопки - то из методов этого подкласса мог бы
свободно обращаться к Protected свойству.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
27.07.2005, 12:15:11
    #33186619
Создание свойства класса.
Igor Korolyov
Hi И_Я_хочу_Знать!

> Все эти значения относятся к видимости свойства для дочерних классов и для
> программы.

нет, ТОЛЬКО для дочерних классов.

Ну наверное не совсем так. При значении Public свойство видят все.


> Так почему при задании Protected класс не видит свойства?

Потому что форма с кнопкой - это не есть наследник класса кнопки (даже
member-объект - кнопка лежащая на этой форме не есть класс-наследник!). Вот
если бы ты сделал подкласс от кнопки - то из методов этого подкласса мог бы
свободно обращаться к Protected свойству.


А вот здесь не совсем понятно. У меня же библиотека классов в котором лежит класс. Или опять путаница с терминалогией в фоксе? (база данных)


To ВладимирМ
Спасибо за ответ. Это просто значит что я не могу пользоватся этой фишкой. И сделаю свойство Public хотя по идеи это ни есть Good.
...
Рейтинг: 0 / 0
28.07.2005, 01:35:41
    #33188084
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание свойства класса.
Hi И_Я_хочу_Знать!

> Ну наверное не совсем так. При значении Public свойство видят все.

При чём тут public? Мы про Protected говорили, и про то, кто есть "особо
приближенный к телу" чтобы видеть эти Protected свойства.

> А вот здесь не совсем понятно.

Увы, я не могу по другому это выразить... Разве что через код...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
PUBLIC goFrm
goFrm = CREATEOBJECT("frm")
m.goFrm.show()

DEFINE CLASS cmd AS CommandButton
PROTECTED MyProp
MyProp = "protected property is here :)"
PROCEDURE Click
    MESSAGEBOX(This.MyProp,  0 , "cmd")
ENDPROC
ENDDEFINE

DEFINE CLASS cmd2 AS cmd
PROCEDURE Click
    DODEFAULT()
    MESSAGEBOX(This.MyProp,  0 , "cmd2")
ENDPROC
ENDDEFINE

DEFINE CLASS frm AS Form
ADD OBJECT cmdOnForm AS cmd2

PROCEDURE cmdOnForm.Click
    DODEFAULT()
    MESSAGEBOX("Will raise error!",  0 , "frm")
    * Обрати внимание на имя класса!
    * Обращения к свойству нет, т.к. это вызовет ошибку
ENDPROC
ENDDEFINE
Что мы имеем? cmd2 есть наследник cmd - ему свойство доступно.
frm НЕ ЕСТЬ наследник cmd или cmd2 - ему свойство недоступно.
Можешь ради интереса повставлять в методы вызов ACLASS() и посмотреть
иерархию наследования для каждого из этих классов.

В vcx несмотря на внутренне отличающуюся схему хранения информации, по сути
действуют те-же самые правила - форма с кнопкой НЕ является наследником
класса, от которого сделана кнопка - и потому доступа к Protected свойству
не имеет.

Вообще обычно если свойства "прячут", то это либо потому что их не нужно
нигде "вовне" использовать, либо для того, чтобы организовать к ним доступ
посредством специальных методов - которые проведут какую-то свою хитрую
проверку, и либо позволят получить/изменить свойство либо нет. Впрочем в
фоксе это решается посредством Access/Assign методов вполне эффективно.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Создание свойства класса. / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]