|
抽象类与接口紧密相关,它们不能示例化,并且常常部分实现或根本不实现。抽象类和接口之间的一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。可以在创建组件时使用抽象类,因为它们使您得以在某些方法中指定不变级功能,但直到需要该类的特定实现之后才实现其他方法。抽象类也制定版本,因为如果在派生类中需要附加功能,则可以将其添加到基类而不中断代码。
在 Visual Basic 中,抽象类用 MustInherit 关键字表示。在 C# 中,则使用 abstract 修饰符。任何所谓不变的方法都可以编码至基类中,但在 Visual Basic 中,任何要实现的方法都用 MustOverride 修饰符标记。在 C# 中,这些方法标记为 abstract。下例显示了一个抽象类:
'' Visual Basic
Public MustInherit Class WashingMachine
Sub New()
'' Code to instantiate the class goes here.
End sub
Public MustOverride Sub Wash
Public MustOverride Sub Rinse (loadSize as Integer)
Public MustOverride Function Spin (speed as Integer) as Long
End Class
// C#
abstract class WashingMachine
{
public WashingMachine()
{
// Code to initialize the class goes here.
}
abstract public void Wash();
abstract public void Rinse(int loadSize);
abstract public long Spin(int speed);
}
在上面的示例中,用一个已实现的方法和三个未实现的方法声明抽象类。从该类继承的类必须实现 Wash、Rinse 和 Spin 方法。下例显示了该类实现的可能形式:
'' Visual Basic
Public Class MyWashingMachine
Inherits WashingMachine
Public Overrides Sub Wash()
'' Wash code goes here
End Sub
Public Overrides Sub Rinse (loadSize as Integer)
'' Rinse code goes here
End Sub
Public Overrides Function Spin (speed as Integer) as Long
'' Spin code goes here
End Sub
End Class
// C#
class MyWashingMachine : WashingMachine
{
public MyWashingMachine()
{
// Initialization code goes here.
}
override public void Wash()
{
// Wash code goes here.
}
override public void Rinse(int loadSize)
{
// Rinse code goes here.
}
override public long Spin(int speed)
{
// Spin code goes here.
}
}
在实现抽象类时,必须实现该类中的每一个抽象 (MustOverride) 方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值。
|