的VBScript:具有相同属性名

的VBScript:具有相同属性名

问题描述:

一个类的内部功能的知名度考虑到我们有一个脚本的VBScript:具有相同属性名

Option Explicit 

Class CClass 
    Private m_date 

    Private Sub Class_Initialize() 
     m_date = CDate("1970-01-01 00:00:00") 
    End Sub 

    Public Function Foo() 
     Dim d : d = Date() 
     WScript.Echo "d is " & FormatDateTime(d, vbGeneralDate) 
    End Function 

    Public Property Get Date() 
     Date = m_date 
    End Property 

    Public Property Let Date(p_date) 
     m_date = CDate(p_date) 
    End Property 

End Class 

Dim obj : Set obj = NEW CClass 
Call obj.Foo() 

如何类功能CClass.Foo()调用内置VBScript函数日期()没有财产CClass。日期干扰?

我现在的解决方案是引入一个可以调用的虚拟Date_()函数。但那似乎是错误的。我认为应该有某种方式来指定我们想调用类范围之外的某些东西。

我几乎是积极的,有没有办法做你在VBScript中要求什么。

但即使你可能找出办法做到这一点,你真的不应该。您需要为自己的函数选择不与内置函数名称冲突的名称。对于像VBScript这样的动态脚本语言来说,其他任何东西都是完全不可维护的。

为您的Date属性选择一个不同的名称。最好是更具描述性:该属性返回什么样的日期?日期是指什么?它如何被使用?无论你做什么,都不要将它重命名为Date_--这没什么更好的。

+0

我相信你是对的,它永远不会工作。什么属性命名,我不想在该属性中重复该类的名称:例如类是CEvent,属性是EventDate;最好似乎是多余的。但是,你的建议似乎是合理的。也许我应该忍受它。如果没有什么相关的话,我会给一些时间给别人提出意见并表明你接受了。 – msk 2011-03-04 12:23:01

+0

@msk:如果是这样,我肯定会去'EventDate'。 (或者更具描述性的内容,比如'ScheduledDate')。为了清晰起见,你正在交易一点冗余,并且消除了隐藏内置方法的可能性。如果打字真的困扰你,我最好的建议是找到VB 6的旧版本,并利用其IntelliSense(自动完成)功能。即使您从不使用编译器,它也可以用于VBScript代码。 – 2011-03-04 12:25:26

+0

同意。你提出非常有效的分数。 – msk 2011-03-04 12:48:43

您可以从类喜欢里面调用它: Dim d : d = me.Date()

在VBScript Me是一样的,你在JavaScript中使用This例如

+0

我想你误会了。我绝对不想调用类属性。 – msk 2011-03-04 12:45:49

+0

啊,好的。是的,我误解了。您可以使用ExecuteGlobal()语句和全局变量进行肮脏的黑客攻击。或者在你的类之外的passthru函数只传递Date()的结果,但它不会变得更漂亮。所以,我必须同意科迪格雷。 – AutomatedChaos 2011-03-04 14:26:21

来不及参加聚会,但使用的解决方案eval功能。 see eval function docs for details

Class CClass 
    Private m_date 

    Private Sub Class_Initialize() 
     m_date = CDate("1970-01-01 00:00:00") 
    End Sub 

    Public Function Foo() 
     Dim d : d = eval("Date()") 
     WScript.Echo "d is " & FormatDateTime(d, vbGeneralDate) 
    End Function 

    Public Property Get Date() 
     Date = m_date 
    End Property 

    Public Property Let Date(p_date) 
     m_date = CDate(p_date) 
    End Property 

End Class 

Dim obj : Set obj = NEW CClass 
Call obj.Foo()