码迷,mamicode.com
首页 > 其他好文 > 详细

类 的重载(Overloads)与隐藏(Shadows)

时间:2015-11-17 16:32:31      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:

我在上篇文章中讲解了类 的继承和重写,如果想要在派生类中重写基类了方法或函数,那首先基类必须要有用 Overridable 关键字的公开声明的方法或函数,这样,基类的派生类才能用 Overrides 关键字来重写基类带有 Overridable 关键字的公开方法或函数。

重载是什么意思呢?

重载(Overloads): 就是我们可以用同样的名称,在派生类中用不同的参数列表来创建多个方法和属性,在调用时就可以适应不同参数类型的要求。

呵呵...那好,我们来看一下,这样的写法会有什么结果:

Module Module1

    Public Class baseClass

        Public Function CountY() As Integer

            CountY = 100

        End Function

    End Class

    Private Class derivedClass

        Inherits baseClass

        Public Overloads Function CountY(ByVal i As Integer) As Integer

            CountY = i * 2

        End Function

    End Class

End Module

好!基类和派生类写好了,派生类中也重载了基类的 ConutY 函数,那我们就来实例化派生类,并使用它的函数看看什么情况:

技术分享

 技术分享

呵呵,看到了吧,居然有两个 CountY 函数,一个无参数的和一个有参数的!!为什么会这样呢?基类的无参数 CountY 函数怎么会出现在派生类的对象中?

没错 ,我在类的继承和重写的文章中讲到,派生类具有继承基类所以公共成员的能力,你再看基类的 CountY 函数,发现了吧,它用的是Public 关键字声明的,这是公开性的函数。所以...

另外:还记得上篇文章也介绍“显式编写构造函数 New 的事” ,我用了一个 mybase.new() 继承了基类的性质。现在没有写,其实是一种默认的隐式调用。

所以现在的派生类应该是内含两个 CountY 函数了,无参数的 CountY 其实就是基类的方法,是由于 Overloads 和 Mybase.new() 双重作用的影响。

那再看这样的变化情况。我们在派生类中添加一个用 Overloads 标识的与基类形式一致的无参数 CountY 后,再执行会出现什么情况:

Module Module1

    Public Class baseClass

        Public Function CountY() As Integer

            CountY = 100

        End Function

    End Class

    Private Class derivedClass

        Inherits baseClass

        Public Overloads Function CountY(ByVal i As Integer) As Integer

            CountY = i * 2

        End Function

        Public Overloads Function CountY() As Integer

            CountY = 200

        End Function

    End Class

    Sub main()

        Dim obj As New derivedClass

        Console.WriteLine("带参数的 CountY 函数的返回值为:{0} ", obj.CountY(10))

        Console.WriteLine("无参数的 CountY 函数的返回值为:{0} ", obj.CountY())

        Console.Read()

    End Sub

End Module

 我们来看看结果:

技术分享

怎么样,是不是很好奇,为什么是执行的派生类中的无参数函数 CountY ,而不是执行的基类中的无参数函数 CountY ?

其实这就叫隐藏(Shadows)!

我们用 Overloads 重载方式隐藏了基类的同名方法,以防用户发生混淆。

一般来说,隐藏有两种情况:一种是通过范围来实现。比如你定义一个全局变量 x,但在一个方法中 ,你又定义了一个局部变量 x,在方法中使用 x 时,使用的是局部变量的那一个, 也就是局部变量 x 在方法中隐藏了全局变量x(这里牵涉到作用域的概念,所以这个比如不是很恰当);另一种情况,就是通过继承来隐藏。方法么,除了刚才用的 overloads,还可以用 Shadows 关键字来实现。

Shadows(遮蔽、阴影),倒是很贴切的名字。

Shadows功能很强的。

   Private Class derivedClass
        Inherits baseClass

        Public Shadows Function CountY(ByVal i As Integer) As Integer

            CountY = i * 2

        End Function

    End Class

 好了,我们用 Shadows 关键字代替 Overloads 来实现重载后,看看会出现几个 CountY 函数:

技术分享

看到了吧,只有一个了!

我们看运行结果:

Sub main()
        Dim obj As New derivedClass
        Console.WriteLine("带参数的 CountY 函数的返回值为:{0}", obj.CountY(50))
    End Sub

如图:

技术分享

“哈,真的呢,基类的方法看不到了。但是,这和重写的效果岂 不是一样了吗?”我不由地又想起一个问题,如果是一样的作用,要 Shadows干什么呀。

“还是有区别的。”大李开始扳着指头数 起来,“最明显的区别在于,隐藏适用于任何元素类型,你可以在派生类中 用Public Shadows oldY as Integer来隐藏基类的oldY()方法;而重写只能适用 于方法与属性,而且声明参数与修饰符都要求完全一致。”

“ 还要注意一点,当派生类又派生出一个子类时,重写与隐藏都会被继承下去。当 然,如果在派生类中是用private来修饰Shadows成员的话,它的子类就会继承它 基类的成员了。”

“我倒是感觉,现在VB.NET对继承的处理功 能真的很强大,有继承,对于编程者来说,真的是件好事。”我不由感叹道 。

“不错,继承层次体系是有很多好处,但是事物总是有其双面性 ,继承也有不少问题,其中最麻烦的,就是‘脆弱的基类’。” 大李紧锁眉头认真地说。

“哦,什么叫‘脆弱的基类’ ?”我不解地问。

类 的重载(Overloads)与隐藏(Shadows)

标签:

原文地址:http://www.cnblogs.com/lfls128/p/4950187.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!