VB接口的使用方法

接口定义】接口就是指只包含虚成员的虚类。

(1)虚类,表明了接口是不能够被直接实例化的。也就是说,接口只是一个抽象概念。比如我们说车可以跑,人可以跑,马可以跑。我们可以看到实例化的车、人、马。但是我们可以定义一个“会跑的物质”。它可以是车,也可以使人、马,但是我们却不能说“这个东西就是一个会跑得物质,但是它并不是车、人或者马。”

(2)只包含虚成员,表明了接口只是说明了它具有什么样的功能,可以提供什么样的信息。但是这些功能和信息究竟是什么,如何提供我们无法得知。就像是“会跑的物质”,我们知道它可以跑,但是具体他怎么跑我们就不知道了。之所以说接口可以部分替代多继承,就是因为VB.NET只允许一个类继承自另一个,且只能是这个类;但是一个类可以实现一个或多个接口。由于接口不实现成员,只声名成员,所以也就不存在多继承的路径问题了。

什么情况下使用接口:

当我们面临一个问题,就是我们有一个功能,它需要操作不同的类的实例去完成一个目的相同的方法的时候,我们就可以把这些目的相同的方法作为接口来实现。这里我们就用橘子苹果的例子举例:

橘子苹果实例

功能分析:

有个只进不出的盒子,水果有两种苹果和香蕉,原始重量分别是50、30。放入盒中,水分丢失,重量减轻,分别减轻4、3,直到达到自身3/5不再轻。

盒子功能:

1、一天前的总重量

2、输出苹果数量

3、输出橘子数量

4、输出一天盒中水果减轻的总重量

5、当前的总重量

这里主要用到的方法就是统计当前重量、统计减少重量。橘子和苹果都用到了这两个相同方法实现相同的目的。所以在这个例子中我们就把统计当前重量、统计减少重量这两个方法封装成了接口。这个例子是让苹果和橘子类去完成此接口(目的相同的方法),以实现软件最终的功能目的。

代码实现

1、Furit接口提供的方法:统计当前重量、统计减少重量。

'******************************
'作者:周家林
'说明:Fruit接口
'日期:2015.8.16
'******************************
Public Property Get CurWeight() As Double   '方法:统计当前的重量
End Property

Public Function ReduceWeight() As Double    '方法:统计减少多少重量
End Function

2、Apple类实现接口

Implements Fruit
Private mvarCurWeight As Double           '定义当前重量的变量
Private MvarTotalWeight As Double         '定义总重量的变量

Private Sub Class_Initialize()            '类的初始化
                                          '苹果的初始化重量为50,当前的重量也是50
    MvarTotalWeight = 50
    mvarCurWeight = MvarTotalWeight

End Sub

Private Property Get Fruit_CurWeight() As Double    '写入苹果当前的重量

    Fruit_CurWeight = mvarCurWeight

End Property

Private Function Fruit_ReduceWeight() As Double     '苹果的重量每天减少4,直到是原始重量的3/5
    Dim oldWeight As Double                         '定义旧重量的变量
    oldWeight = mvarCurWeight                       '将减少前的重量值赋给旧重量

    mvarCurWeight = mvarCurWeight - 4               '苹果减重4
    If (mvarCurWeight < MvarTotalWeight * 3 / 5#) Then

        mvarCurWeight = MvarTotalWeight * 3 / 5     '苹果最低重量的整个的3/5

    End If

    Fruit_ReduceWeight = oldWeight - mvarCurWeight  '返回值是减少的重量=旧重量-新重量

End Function

3、Orange类实现接口

Implements Fruit
Private mvarCurWeight As Double           '定义当前重量的变量
Private MvarTotalWeight As Double         '定义总重量的变量

Private Sub Class_Initialize()            '类的初始化
                                          '橘子的初始化重量为50,当前的重量也是50
    MvarTotalWeight = 30
    mvarCurWeight = MvarTotalWeight

End Sub

Private Property Get Fruit_CurWeight() As Double    '写入橘子当前的重量

    Fruit_CurWeight = mvarCurWeight

End Property

Private Function Fruit_ReduceWeight() As Double     '橘子的重量每天减少3,直到是原始重量的3/5
    Dim oldWeight As Double                         '定义旧重量的变量
    oldWeight = mvarCurWeight                       '将减少前的重量值赋给旧重量

    mvarCurWeight = mvarCurWeight - 3               '橘子减重4
    If (mvarCurWeight < MvarTotalWeight * 3 / 5#) Then

        mvarCurWeight = MvarTotalWeight * 3 / 5     '橘子最低重量的整个的3/5

    End If
    Fruit_ReduceWeight = oldWeight - mvarCurWeight  '返回值是减少的重量=旧重量-新重量
End Function

4、FruitBox类是功能实现的一个类,此软件的功能全部都是在FruitBox类中的实现。

Private mcol As Collection                      '定义集合,元素是水果

Public Sub AddFruit(aFruit As Fruit)            '向盒子中添加一个水果
    mcol.Add aFruit

End Sub

Public Function TotalFruitWeight() As Double    '计算当前盒子水果的总重量
    Dim aFruit As Fruit
    Dim total As Double

    total = 0
    For Each aFruit In mcol
        total = total + aFruit.CurWeight
    Next

    TotalFruitWeight = total                    '函数返回值是所有的总重量

End Function

Public Function PassOneDay() As Double          '经过一天后盒子的重量
    Dim aFruit As Fruit
    Dim total As Double

    total = 0
    For Each aFruit In mcol

        total = total + aFruit.ReduceWeight     '所有水果减轻的重量

    Next

    PassOneDay = total                          '函数返回值是所有的总重量

End Function

Public Function NumOfApples() As Long           '盒子里面苹果的个数
    Dim aFruit As Fruit
    Dim count As Long

    count = 0
    For Each aFruit In mcol
        If (TypeName(aFruit) = "Apple") Then

            count = count + 1
        End If

    Next

    NumOfApples = count

End Function

Public Function NumOfOranges() As Long          '盒子里面橘子的个数
    Dim aFruit As Fruit
    Dim count As Long

    count = 0
    For Each aFruit In mcol
        If (TypeName(aFruit) = "Orange") Then

            count = count + 1
        End If

    Next

    NumOfOranges = count

End Function

Private Sub Class_Initialize()                  '初始化建立集合

    Set mcol = New Collection

End Sub

Private Sub Class_Terminate()                   '清理内存,释放集合对象
    ReleaseFruits
    Set mcol = Nothing

End Sub

Private Sub ReleaseFruits()                     '释放对象
    Dim aFruit As Fruit

    For Each aFruit In mcol

        Set aFruit = Nothing

    Next

End Sub

5、主窗体实例化,主窗体通过调用FuritBox里的具体功能方法,来实现主窗体具体操控功能。然后将整个系统运算的结果呈现到主窗体上Text中,供用户查看。

Dim Box As Fruitbox                             '定义一个盒子类型
Private Sub cmdApple_Click()                 '添加一个苹果
    Box.AddFruit New Apple
End Sub
Private Sub cmdOrange_Click()                '添加一个橘子
    Box.AddFruit New Orange
End Sub
Private Sub cmdPassDay_Click()                  '过了一天统计
    Dim str As String                           '定义字符串变量
    Dim Old As Double                           '定义旧重量变量
    Dim Reduce As Double                        '定义损失重量变量
    Dim Now As Double                           '定义新重量变量

    Old = Box.TotalFruitWeight()                '调用FruitBox类的TotalFruitWeight方法
    str = "一天前总重量有:" & Old
    LstShow.AddItem str

    str = "苹果有:" & Box.NumOfApples()        '调用FruitBox类的NumOfApples方法
    LstShow.AddItem str

    str = "橘子有:" & Box.NumOfOranges()       '调用FruitBox类的NumOfOranges方法
    LstShow.AddItem str

    Reduce = Box.PassOneDay                     '调用FruitBox类的PassOneDay方法
    str = "一天损失重量:" & Reduce
    LstShow.AddItem str

    Now = Box.TotalFruitWeight()                '调用FruitBox类的TotalFruitWeight方法
    str = "当前重量:" & Now
    LstShow.AddItem str
    LstShow.AddItem ""
End Sub
Private Sub Form_Load()                         '创建一个盒子对象
    Set Box = New Fruitbox
End Sub
Private Sub Form_Unload(Cancel As Integer)      '释放一个盒子对象
    Set Box = Nothing
End Sub

小结】当我们操作不同的类的实例去完成一个目的相同的方法的时候,我们就可以把这些目的相同的方法作为接口来实现。接口其实就是目的相同的方法的集合。我感觉通过这个具体的实例及代码我们可以对接口理解的更深刻一些。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-26 22:23:11

VB接口的使用方法的相关文章

C#中实现VB中的CreateObject方法

经常看到有些VB的例子中直接用个CreateObject就可调用系统功能(大多是COM对象),像用户设定,网络设定等等.虽然C#中可以通过使用VB的命名空间的方法来调用CreateObject函数,但是这样比较没什么用,因为生成的对象的所带有的方法都不能使用.C#中还可以直接用添加引用的方式来调用一些对象,前提是你知道该添加哪个引用.当我上网搜索,已经搜索到很多VB的成功用CreateObject调用的例子,C#的例子却很难找到的时候,就干脆用类似VB的方法算了,很简单.免得继续在网络中大海捞针

RequestDispatcher接口的include()方法与forward()方法的区别

RequestDispatcher接口所定义的forward()方法可以将HTTP请求转送给其他Web资源(例如Servlet.JSP或HTML)进行处理,并产生HTTP回应.RequestDispatcher接口的include()方法与forward()方法非常类似,惟一的不同在于:利用include()方法将HTTP请求转送给其他Servlet后,被调用的Servlet虽然可以处理这个HTTP请求,但是最后的主导权仍然是在原来的Servlet.RequestDispatcher是一个Web

实习第一周第一天:接口 extends是继承类,implement是实现接口,原接口里面的方法填充,方法名也是不变,重写override是父类的方法名不变,把方法体给改了

一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 接口定义的一般形式为: [访问控制符]interface <接口名> { 类型标识符final 符号常量名n = 常数: 返回值类型  方法名([参数列表]); - } 二.接口的特点 1.Java接口中的成员变量默认都是public,static,final类型的(都可省略),必须被显

C#接口多继承方法重名问题

最近实现一个功能需要继承两个接口,然而父类接口有这重名的方法,且方法实现一致.两个父接口均被多个子接口继承,并在类实例中实现.起初,我是通过new重名方法来实现我的功能调用.后被指正,在网上看了一个工友解决类似问题的方法,这里引用记录一下. 引自:http://www.cnblogs.com/xgw2004058/archive/2010/06/18/1760046.html 经常,一个类会实现多个接口,比如用户的一个控件继承自"IEdit"和"ICombo",每个

C#类、接口、虚方法和抽象方法

虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,并为派生类提供了重写该方法的选项.抽象方法没有提供实现部分,抽象方法是一种强制派生类重写的方法,否则派生类将不能被实例化 2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写.虚方法不是也不必要重写.其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的 3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚拟方法不必.抽象方法不能声明方法体,而虚拟方法可以. 包含抽象方法的类不能实例化 ,

C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法

使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委托 public delegate decimal MathOperation(decimal left, decimal right); //创建方法参数和返回结果符合委托的定义 public static decimal Add(decimal left, decimal right) { re

接口 抽象类 虚方法 三者比较-1

接口 1.接口只提供方法规约,不提供方法体: 2.接口中的方法不能用关键字修饰: 3.接口里不能有接口和变量: 4.接口里的方法在子类中必须全部实现: 5.接口可以实现多重继承: 抽象类 1.抽象类可以从接口继承: 2.抽象类中的实体方法在子类中不可以重写,只可以被引用: 3.抽象类中的抽象方法不可以有方法体,抽象类中的抽象方法在子类中必须重写: 4.抽象类中的虚方法在子类中可以选择性的重写: 虚方法 1.可以在子类选择性的重写: 2.不重写也可被子类调用: 接口与抽象类的异同 1.抽象类的抽象

为什么Java中有些接口没有任何方法

由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念.接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类.接口中只包含方法的定义,没有方法的实现.接口中的所有方法都是抽象的.接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰.由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接的达到多重继承的目的. 在Java语言中,有些接口内部没有声明任何方法,也

Java学习之接口的子类必须实现接口的全部方法吗?

接口的子类必须实现接口的全部方法吗?      接口的子类必须实现接口中全部的方法吗?答案:不是.原因如下:      如果子类是非抽象类,则必须实现接口中的所有方法:      如果子类是抽象类,则可以不实现接口中的所有方法,因为抽象类中允许有抽象方法的存在! 1.抽象类定义 抽象类往往用来表征对问题领域进行分析.设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象.通常在编程语句中用 abstract 修饰的类是抽象类.在C++中,含有纯虚拟函数的类称为抽象类,它不能生