当前位置:编程学习 > VB >>

VB类的问题


Class People

Public peopleName As String

Sub New
peopleName = ""
End Sub

'需要写一个方法,用于获取某peopel的实例。给方法传一个人名,获取一个人的实例。
'人的名字在数据库中存储,可以省略从数据库取数据的过程,我只是想了解下这个方法应该怎么写?

End Class
--------------------编程问答-------------------- 给人名,构造一个实例

Class People
    Public peopleName As String
    
    Sub New           '这是默认的构造
        peopleName = ""
    End Sub
    
    Sub New(ByVal name As String)   '这也是构造
        '添加从数据库获取数据代码
         。。。
    End Sub

    Public Property Name() As String   '利用属性
        Get
            Return peopleName
        End Get
        Set(ByVal value As String)
            pName = value
            '添加从数据库获取的信息
              .......
        End Set
    End Property 
End Class



调用

Dim p1 As People    '用默认构造
p1.Name="张三"      '给实例初始化
Debug.Print p1.Name

Dim p2 As People("张三")   '用第二构造
Debug.Print p2.Name
--------------------编程问答-------------------- 少了new
Dim p1 As new People    '用默认构造
Dim p2 As new People("张三")   '用第二构造
--------------------编程问答-------------------- 感谢您的详细回复 --------------------编程问答-------------------- --------------------编程问答-------------------- 1F 的高人,用的是什么语言啊?

-_-!


' 新建一个类模块
' 在属性窗口中把 (名称) 从默认的类名Class1等,
' 改成 claPeople
'(或者:People  你希望的名称,只要符合命名规则)
Option Explicit

Private peopleName As String

Public Property Get Name() As String    '返回属性值
   Name = peopleName
End Property

Public Property Let Name(ByVal value As String)
   peopleName = value
End Property

Private Sub Class_Initialize()
' 这个类似“构造函数”(注意,不是“是”)
' 实例化后,它会自动被调用
' 在这里可以对本类实例的成员变量进行初始化操作
   peopleName = ""
End Sub

'Private Sub Class_Terminate()
'' 这个是“析构函数”
'' 实例被销毁前自动被调用
'' 必要时,在这儿进行资源、内存空间等的释放操作
'End Sub


' 窗体代码:
Option Explicit

Private Sub Command1_Click()
' 实例化方法一:
      Dim objPeople As New claPeople
   objPeople.Name = "张三"
   Me.Cls
   Me.Print "用法1"
   Me.Print objPeople.Name
End Sub

Private Sub Command2_Click()
' 实例化方法二:
      Dim objPeople As claPeople
      'Dim objPeople As Object    ' 也可以这样
   Set objPeople = New claPeople
   objPeople.Name = "张三"
   Me.Cls
   Me.Print "用法2"
   Me.Print objPeople.Name
End Sub

--------------------编程问答-------------------- 1F 的难道是 VB.NET 的代码?



如果在类代码中,把:
Private peopleName As String
改成:
Public  peopleName As String

实例化后就可以直接操作这个成员了。
简单变量、非关键的成员变量是可以这样做的。

但复杂些的类,里面有对类的行为方法有决定作用的变量,
一定要用Privete的,这样可以防止在‘使用时’,类的成员变量值被更改。
类的“属性”推荐通过类的属性函数来进行操作。
如果类的某‘属性’只有 Get 而不提供 Let ,则这个属性就是“只读”的。

还有一些复杂的‘类成员属性’,也许就只能通过属性函数来操作了。

当然,类也可以提供一些 Public 的 Function 、Sub ,通过传递的参数来操作类成员。
--------------------编程问答--------------------
引用 4 楼  的回复:
继续提问,请问如下代码有何意义呢?
Public Property Name() As String '利用属性
  Get
  Return peopleName
  End Get
  Set(ByVal value As String)
  pName = value
  '添加从数据库获取的信息
  '.......
  End Set
End Property 

……
我就可以用对象.peopleName获得值及赋值,为什么还要写这个呢?

和楼上说的一样,可以对成员的使用作些验证,除些之外,你还可以做些其它事。
一个意义:
你的People类中可能还有其它特征,比如性别,照片,电话号码,当你改变人名时,你肯定不希望显示的还是另一个人的性别、照片等,这些特征也应该跟着改变,这些你可以在set方法中完成;

Property(属性)的类型和存储它的成员的类型是可以不同的,

在类中你可能用0、1代表性别,而这样对于外人来说不够直观,因此你也可以利用set作些转换,使得别人可以用 Sex="男" 类似的方法赋值,尽管实际存储的是整型的;
同样的,你的类中存储的可能只是照片路径的string,但你可以通过get把他转换为Image

使用属性为对象的封装提供了极大的好处 --------------------编程问答--------------------
引用 5 楼  的回复:
1F 的高人,用的是什么语言啊?

-_-!



VB code

' 新建一个类模块
' 在属性窗口中把 (名称) 从默认的类名Class1等,
' 改成 claPeople
'(或者:People  你希望的名称,只要符合命名规则)
Option Explicit

Private peopleName As String

Public Property G……

VB.net
唉!.net不招人待见,连VB也遭殃
其实VB.net提供的语言特性真的比VB6好得多,可惜.net --------------------编程问答-------------------- 呵呵,楼上的各位达人,感谢,我初学者,对很多东西一知半解。
我现在大概了解了上面各位说的了,现在假如有一个命题,就是构造函数只能是不带参数的New,我如何获得一个对象呢?
我把我的想法写出来,各位看看妥否(主要看GetPeople函数妥否)?
Class People
    Public peopleName As String
    
    Sub New
        peopleName = ""
    End Sub
    
    Function GetPeople(n as String) as People
        '因为我假使只能有一个New不带参数的构造函数,所以我先创建一个准备返回的People,不知这里思路对不

          Dim p as New People
        '从数据库查找n名称的人,将属性赋值给p
        Set GetPeople = p    '将p当做函数返回值返回

    End Function

    Public Property Name() As String   '利用属性
        Get
            Return peopleName
        End Get
        Set(ByVal value As String)
            pName = value
            '添加从数据库获取的信息
              .......
        End Set
    End Property 
End Class

   --------------------编程问答-------------------- 最主要的问题是,我现在假使只能有一个Sub New不带参数的构造函数,在一个类中,想得到一个参数后查找某人,再将找到的人的对象返回给前端调用。

各位看看我上面的写法对吗,或者假使只能写一个不带参数的New,还有其他方法可以返回一个实例吗?》 --------------------编程问答-------------------- 构造函数只是为对象属性初始化提供一种方法,带参不带参无所谓;

不明白你的意图是什么,你要GetPeople得到一个实例,就得先有一个People的实例,怎么看起来像个孕妇 --------------------编程问答-------------------- 很难理解一个People(人)会提供一个得到其它People(人)的服务,如果没理解错的话,你应该是想通过"人类"来提供,那你应把GetPeople定义为静态(Shared)的,这样就可以用 类名.GetPeople来获得一个People的实例 --------------------编程问答-------------------- 我的意图就是,我现在要写一个函数,这个函数传递进去一个人名,然后再数据库中查找这个人,将人的属性提取,赋值,然后将这个人作为一个对象返回。

不知道像下面这么写可以吗,或者有没有其他方法,前提是,我不能使用New People("人名")的构造函数方式。 --------------------编程问答-------------------- --------------------编程问答-------------------- 可以的 --------------------编程问答-------------------- .net啊
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,