标签:
我在上篇文章中讲解了类 的继承和重写,如果想要在派生类中重写基类了方法或函数,那首先基类必须要有用 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对继承的处理功 能真的很强大,有继承,对于编程者来说,真的是件好事。”我不由感叹道 。
“不错,继承层次体系是有很多好处,但是事物总是有其双面性 ,继承也有不少问题,其中最麻烦的,就是‘脆弱的基类’。” 大李紧锁眉头认真地说。
“哦,什么叫‘脆弱的基类’ ?”我不解地问。
标签:
原文地址:http://www.cnblogs.com/lfls128/p/4950187.html