基于.NET 4面向对象编程高级主题(一):类的继承与方法重写

一、继承(Inheritance)

Visual Basic.NET 支持“继承”,这是一种定义作为派生 (Derivation Class) 基础的类的能力。派生 类继承并可扩展基类的属性(Property)、方法(Method)和事件(Event)。派生类还可以用新的实现重写继承的方法。默认情况下,用 Visual Basic .NET创建的所有类都是可继承的。
继承使您得以只编写和调试类一次,然后将该代码作为新类的基础不断重复使用。继承还使您得以使用基于继承的多态性(Polymorphism),这是一种定义如下类的能力:这些类可由客户端代码在运行时交换使用,但具有功能不同而名称相同的方法或属性。
 
通俗的说,继承就是子承父业,假设定义一个Father类作为基类(父类),然后定义一个子类(派生类)Son,在Son这个类中添加以下突出显示的代码:(Code 1)
Public Class Son
   
Inherits Father
End Class 
这时候,就会发现Son是从父类Father里面继承下来的,假设Father有Sport,EditProgram这两个方法,以及Tall这个属性,那么子类同样包含了父类所具备的 Sport,EditProgram这两个方法,以及Tall这个属性,但是这些方法和属性可以在子类中进行重写(Overridable)

我们在设计Windows应用程序(Application)窗体的时候,Visual Studio会自动创建一个空白的窗体,而这个窗体则是从Form类中继承下来的,如果打开名字为Form1的空白Windows窗体设计视图的Design文件,则会发现以下突出显示的代码:(Code 2)
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub
    Private components As System.ComponentModel.IContainer
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        components = New System.ComponentModel.Container()
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.Text = "Form1"
    End Sub
End Class

二、重写(Overridable)

通常,派生类继承基类的方法,因此在调用对象(Object)继承方法的时候,调用和执行的是基类的实现。但是,有时需要对派生类中的继承方法有不同的实现。 例如, 假设动物类存在“跑” 的方法, 从中派生出马和狗, 马和狗的跑得形态是各不相同的, 因此同样方法需要两种不同的实现, 这就需要“重新编写”基类中的方法。
“重写”基类方法就是修改它的实现或者说在派生类中重新编写。

重写方法通常使用Overridable关键字来修饰并说明, 指定属性或过程可由派生类中同名的属性或过程进行重写,比如说存在两个类Father和Son,Son继承于Father,Father类中存在一个方法Sport,其详细代码突出显示如下:(Code 3)
Public Class Father
    ……
   
Public Function Sport() As String
        Return "I love sports!"
    End Function

    ……
End Class

现在从Father类继承下来的Son中,我们假设Son不喜欢Sport,则我们可以修改这个从Father类继承的方法:(Code 4)
Public Class Son
    Inherits Father
    ……
    
Public Overridable Function Sport() As String
        Return "I hate sports!"
    End Function

    ……
End Class


当然,我们也可以重写系统方法,通常,系统方法(System Method)是受保护(Protected)的,这时,我们就要添加Protected修饰符进行声明。假设我们要重写RichTextBox控件的Copy()这个方法,则重写方法的代码如下:(Code 5)
Protected Overridable Sub Copy(ByVal strValue As String)
    My.Computer.Clipboard.SetText(strValue)
End Sub

三、抽象类(Abstract Class)与抽象方法(Abstract Method)

抽象类必须被继承但是不能被实例化( Instantiation )。比如说,人类会说话,会思考,会制作和使用工具,而这些就是人类这个类的基本成员,但是人类无法详细描述一个单一的人 或实体 ,但是,从继承于人类这个类的美国人,中国人和日本人则可以尽量详细的描述一个人或实体,那么在这里,人类就充当了一个抽象类,则 美国人,中国人和日本人就是从人类这个抽象类继承下来的子类。如下图:

http://b398.photo.store.qq.com/psb?/db8a27e4-cd75-4188-81f8-b095be718e2f/55HKHecTMqI*mnTRJorHmPZwsIOGiPdMdN47WZ0bjts!/b/dH*QR.3MDwAA&bo=BwN*AQAAAAABAF0!&su=0179402993&rf=2-9
 
下列代码演示了如何定义抽象类:(Code 6)
Public MustInherit Class Human
    Public MustOverride Function SayHello() As Object
    Public MustOverride Function Wolk() As Object
End Class  

抽象类具有以下特征:
1、抽象类不可以直接调用New指令进行实例化。
2、抽象类必须要通过继承才可以使用其功能。
3、抽象类中可以声明抽象方法。
4、继承抽象类的子类,必须要实现所有的抽象方法。

抽象方法是必须被继承的子类重写但是在重写之前不能定义方法体(The body of a method),在父类中必须用MustOverrides修饰符进行声明。例如:(Code 7)
Public MustOverride Function SayHello() As Object

声明抽象方法要注意以下几点:
1、抽象方法只能声明在抽象类中。
2、抽象方法不能用Private修饰。
3、继承抽象类的子类,必须要实现所有的抽象方法。
4、若是抽象类的子类未实现所有的抽象方法,则该子类就必须声明为抽象类。

现在,
我们来通过抽象类和抽象方法来做一个基于Code 6的综合实例, Code 6的代码在这里省略,则其他代码如下:(Code 8)
(Code 8.1)
Public Class American
    Inherits Human
    Public Overrides Function SayHello() As Object
        Return "Hello"
    End Function
    Public Overrides Function Wolk() As Object
        Return "My native language is English"
    End Function
End Class

(Code 8.2)
Public Class Chinese
    Inherits Human
    Public Overrides Function SayHello() As Object
        Return "你好"
    End Function
    Public Overrides Function Wolk() As Object
        Return "我的母语是汉语"
    End Function
End Class
 
(Code 8.3) 
Public Class Japanese
    Inherits Human
    Public Overrides Function SayHello() As Object
        Return "こんにちは"
    End Function
    Public Overrides Function Wolk() As Object
        Return "私は母語は日本語で"
    End Function
End Class

四、密封类(Sealed Class)和密封方法(Sealed Method)

密封类是不可以被继承的且不能被实例化的类,比如说:(Code 9)
Public NotInherit Class Chinese
    '类成员声明
End Class 


密封方法是不可以继续被重写的方法,比如说:(Code 10)
Public  NotOverridable Function Walk() As Object
    '方法体以及内部成员定义
End Function 

2014-07-07

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值