ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 5534|回复: 11

Class中 (set 與 get) Property 與 一般function sub 之差異?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-2-11 14:37 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:类和类模块
我一直都覺得property可用的用function sub 也可達成,如下範例所示:這是Class 名 class1

  1. 'Class1
  2. Private a As Integer
  3. 'property設定
  4. Public Property Let P_seta(ByVal para_a As Integer)

  5.     a = para_a

  6. End Property

  7. Public Property Get P_getA() As Integer

  8.     P_getA = a

  9. End Property


  10. '用sub function 設定
  11. Public Function setA(para_a As Integer)
  12.     a = para_a

  13. End Function

  14. Public Function getA() As Integer
  15.     getA = a
  16. End Function
复制代码



然後在一般模組中的程式
  1. Sub test()

  2.     Dim c1 As New Class1
  3.    
  4.     '用property來設定
  5.     c1.P_seta = 1 '設定21
  6.     Debug.Print c1.P_getA '顯示 1
  7.    
  8.    
  9.     '用一般的function sub 來設定
  10.     c1.setA (2) '設定2
  11.     Debug.Print c1.getA '顯示2
  12.    

  13. End Sub
复制代码


為何要創這語法呢?有必要使用嗎?

有人能舉出用property比較好的例子嗎?


TA的精华主题

TA的得分主题

发表于 2014-2-11 15:25 | 显示全部楼层
有点差别:

Class1:
Private p As String

Public Property Get Pa() As String
Pa = p
End Property

Public Property Let Pa(ByVal vNewValue As String)
p = vNewValue
End Property

Module:
Sub aaa()
    Dim pp As New Class1
    pp.Pa = "Hello"
    MsgBox pp.Pa
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-11 16:47 | 显示全部楼层
wxhnr 发表于 2014-2-11 15:25
有点差别:

Class1:

是想強調在寫法上更直覺些的樣子?是嗎?
直接就"."就可以處理了,不用在用"()"嗎?
object.pa=XXx
debug.print object.pa

TA的精华主题

TA的得分主题

发表于 2014-2-11 19:13 | 显示全部楼层
property是属性,而Function、Sub是方法
Property可以分别处理Let、Set或Get。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-11 20:38 | 显示全部楼层
joforn 发表于 2014-2-11 19:13
property是属性,而Function、Sub是方法
Property可以分别处理Let、Set或Get。


雖然我也知道他property是設定屬性,但是何必多此一舉呢…

在別的語言(java,python),也並沒有這樣的寫法啊…(我實在深受其害…?java中,早就潛規則 setXXX getXXX)

但我後來一想,
也許是幫人家省去命名名稱的麻煩

而且屬性不用加上"()",方法就要加。

整體感覺比較自然,(雖然你不知道這個屬性是不是public property ,還是被保護過的property, 是小缺點)

不過已經習慣別的語法的我,大約很難改回來了…

TA的精华主题

TA的得分主题

发表于 2014-2-11 20:52 | 显示全部楼层
lolmuta 发表于 2014-2-11 20:38
雖然我也知道他property是設定屬性,但是何必多此一舉呢…

在別的語言(java,python),也並沒有這樣的 ...

可以用let和set以属性的方式来调用函数,同时在let和set函数中加一些处理条件
而不像直接为属性赋值那么简单
下面我自定义了一个icells方法,取代原本的cells方法用行列数赋值,还是用行数和列字母数进行赋值
  1. Function test()
  2.     icells(2, "C") = "ladeng6666"
  3.     MsgBox icells(2, "C")
  4. End Function

  5. Property Get icells(ByVal r As Long, ByVal c As String) As String
  6.     icells = Range(c & r)
  7. End Property

  8. Property Let icells(ByVal r As Long, ByVal c As String, ByVal value As String)
  9.     Range(c & r) = value
  10. End Property
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-11 21:20 | 显示全部楼层
ladeng6666 发表于 2014-2-11 20:52
可以用let和set以属性的方式来调用函数,同时在let和set函数中加一些处理条件
而不像直接为属性赋值那么 ...

問題是這個在function,sub也辦的到啊…

這不過是vba的特色,在外面的角度來看,會很明顯的讓你知道屬性即屬性,方法即方法,這樣而已

TA的精华主题

TA的得分主题

发表于 2014-2-11 21:54 | 显示全部楼层
对于控件之类的对象,它的property在设计时在属性列表中显示或修改,但function和sub则不可以。
你不会希望你的userform不能在设计阶段改变外观,而只能在运行阶段setWidth(), setHeight(), setBackColor()这样的function去改变宽度、高度和背景色吧?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-11 22:13 | 显示全部楼层
小fisher 发表于 2014-2-11 21:54
对于控件之类的对象,它的property在设计时在属性列表中显示或修改,但function和sub则不可以。
你不会希望 ...

這樣說我就理解了,看來這個property算是不可貨缺的語法!

TA的精华主题

TA的得分主题

发表于 2018-9-14 13:33 | 显示全部楼层
对呀 VBA 的 PROPERTY SET/GET 真的不是道有什么 “特别” 的作用, 除了好起来,编码更加像 对象向导(OBJECT ORIENTED)  而已。 同意吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

关注官方微信,每天学会一个新技能

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-10-14 08:43 , Processed in 0.075677 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表