Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261

ООП в VBA: Можно ли использовать методы класса внутри его самого

24.05.2012, 14:29. Показов 5100. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Интересует: является ли это хорошим стилем программирования, или это приведет к проблемам?

Извините, пожалуйста, если плохо сформулировал вопрос - голова уже пухнет от него.

Заранее большое спасибо за любые объяснения по этому поводу!

Добавлено через 14 минут
Уточняю свою проблему:

Вот у меня есть модуль класса.
В нем есть глобальная для класса переменная dTopOffset.
У класса есть свойство, которое является геттером для этой переменной TopOffset.
В самом классе надо обязательно работать с переменной, или можно обращаться к свойству?

К свойству мне обращаться удобнее, т.к. не всегда геттер должен возвращать переменную. Иногда он должен будет вернуть результат некоторых преобразований над ней. Но интуиция подсказывает, что тогда нарушится что-то из столпов ООП.


 Комментарий модератора 
уточни примером с указанием конкретного проблемного места
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2012, 14:29
Ответы с готовыми решениями:

Можно ли внутри самого регулярного выражения использовать функции
Здравствуйте! Я бы хотела спросить, можно ли внутри самого регулярного выражения использовать функции заданные раньше? Например, функцию...

AsyncTask. Можно ли использовать методы return внутри?
При том что они нужны только для другого метода? Или придется либо в один метод всё поместить или создавать переменные и присваивать...

Cannot be resolved to a type. Не могу создать объект класса , и использовать его методы
Проблема в том что в главном файле я не могу создать объект класса SampleServerClass. SV1 компилятор видит как неинициолизорованную...

7
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
24.05.2012, 15:07
А почему нет? Вот код класса:

Visual Basic
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
Private mPriv As Integer
 
Public Sub m1()
 
    Debug.Print "m1"
 
End Sub
 
 
Public Sub m2()
 
    m1  '::: Вызов метода m1 из метода m2
 
    Debug.Print "m2"
 
End Sub
 
Property Get m() As Integer
 
    m = mPriv
 
End Property
 
Property Let m(v As Integer)
 
    mPriv = v
 
End Property
Вот тестовая процедура:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub Test()
 
Dim C1 As myClass
 
    Set C1 = New myClass
    
    C1.m = 11111
    
    Debug.Print C1.m
    
    C1.m1
    
    C1.m2
 
End Sub
Вот ее выдача:


11111
m1
m1
m2

А что такое "геттер?"
1
призрак
 Аватар для ikki
3266 / 894 / 119
Регистрация: 11.05.2012
Сообщений: 1,702
Записей в блоге: 2
24.05.2012, 15:24
Цитата Сообщение от sulfur Посмотреть сообщение
не всегда геттер должен возвращать переменную. Иногда он должен будет вернуть результат некоторых преобразований над ней. Но интуиция подсказывает, что тогда нарушится что-то из столпов ООП.
да с чего Вы это взяли?
а для чего тогда Property Get реализуется через процедуру, а не через ссылку на приватные переменные класса?
в том числе - и для этого.
обрабатывайте что хотите и как хотите.
там, где экземпляр класса будет использоваться, вобщем-то по барабану - что вернул "геттер". лишь бы значение было правильное
1
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
24.05.2012, 16:34  [ТС]
Catstail, я понимаю как это сделать. Мне интересно было - не является ли это быдлокодерством) Но все равно спасибо!

ikki_cf, не знаю с чего взял) Мне казалось что паблик члены класса (в том числе и свойства) нужны для предоставления интерфейса другим объектам, но не ему самому. Видимо, ошибался) Спасибо!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
24.05.2012, 16:47
Не является это "быдлокодерством"... Не комплексуй! "Живая собака лучше мертвого льва". А даже плохо написанная, но РАБОТАЮЩАЯ программа, лучше прекрасно написанной, но НЕ РАБОТАЮЩЕЙ.

И что такое геттер?
0
200 / 98 / 2
Регистрация: 24.09.2011
Сообщений: 261
24.05.2012, 17:14  [ТС]
Геттер - это вот это:
http://ru.wikipedia.org/wiki/%... 0%B8%D0%B5)

Добавлено через 1 минуту
Т.е. это такой метод, который дает доступ к переменной через функцию Property Get

Добавлено через 59 секунд
в твоем классе m - это геттер для mPriv
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
24.05.2012, 22:54
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от sulfur Посмотреть сообщение
К свойству мне обращаться удобнее, т.к. не всегда геттер должен возвращать переменную. Иногда он должен будет вернуть результат некоторых преобразований над ней.
Ну, в классе-то Вам виднее, когда нужна переменная, а когда некоторая функция от нее.
Доступ к переменной через геттер (новое значение слова для меня, до сих пор я знал его только как поглотитель остаточных газов в электронной лампе) занимает гораздо больше времени, чем доступ к переменной как к свойству. Вот сравнение времени доступа.
В классе переменную необходимо объявить как
Visual Basic
1
Public mPriv As Integer
Visual Basic
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
29
30
31
32
33
Type MyType
    n As Integer
End Type
 
Sub test()
Dim t, i&, j%, k%, tt As MyType
With New Class1
    .m = 5
    t = Timer
    For i = 1 To 5000000
        j = .m
    Next
    Debug.Print Timer - t
    DoEvents
    t = Timer
    For i = 1 To 5000000
        j = .mPriv
    Next
    Debug.Print Timer - t
    DoEvents
    t = Timer
    For i = 1 To 5000000
        j = tt.n
    Next
    Debug.Print Timer - t
    DoEvents
    t = Timer
    For i = 1 To 5000000
        j = k
    Next
    Debug.Print Timer - t
End With
End Sub
Результаты (P3-500)
Code
1
2
3
4
 6,085938   геттер
 1,3125     свойство
 0,75       элемент пользовательского типа
 0,75       переменная
4
 Аватар для Апострофф
9908 / 3928 / 742
Регистрация: 11.10.2011
Сообщений: 5,908
25.05.2012, 09:10
Лучший ответ Сообщение было отмечено как решение

Решение

А если компенсировать результаты на время по организации цикла, то разница становится ещё более впечатляющей
Visual Basic
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
29
30
31
32
33
34
35
36
37
38
39
40
41
Type MyType
    n As Integer
End Type
 
Sub test()
Dim t!, i&, j%, k%, tt As MyType, t0!
Const U& = 50000000
 
t = Timer
For i = 1 To U
Next
t0 = Timer - t
'Debug.Print t0
 
With New Class1
    .m = 5
    t = Timer
    For i = 1 To U
        j = .m
    Next
    Debug.Print Timer - t - t0
    DoEvents
    t = Timer
    For i = 1 To U
        j = .mPriv
    Next
    Debug.Print Timer - t - t0
    DoEvents
    t = Timer
    For i = 1 To U
        j = tt.n
    Next
    Debug.Print Timer - t - t0
    DoEvents
    t = Timer
    For i = 1 To U
        j = k
    Next
    Debug.Print Timer - t - t0
End With
End Sub
Code
1
2
3
4
 6,671875    геттер
 1,71875     свойство
 0,28125     элемент пользовательского типа
 0,25        переменная
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2012, 09:10
Помогаю со студенческими работами здесь

Как создать объект класса и использовать его методы, если уже был определен конструктор
Вот код, в нем есть конструктор public Tmas(string path). namespace lab4_OOP { class Tmas { public int a {...

Как правильно вызвать метод класса внутри самого класса?
Здравствуйте. Собственно тема прописана в заголовке: как правильно вызвать метод класса внутри самого класса? Насколько я знаю, для...

Что означает ^ в имени класса и как его можно использовать?
Вопрос к знатокам С++. При работе в Visual Studio, имел дело с классом String пространства имен System: System::String^ My =...

delete внутри класса для самого класса
Доброго времени суток, пишу программу для работы с матрицами. По условию дали лишь несколько библиотек, ни векторов ни cstdio. Для...

Заполнение вектора класса внутри самого класса
class A { private: int a; public: A() { a = 0; }; A get(vector <A>* vec)


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru