** 面向对象程序设计 **
——VB.NET&C# 篇
** 引言 **
.NET 是一种充分体现面向对象( OO )特征的语言平台,这些特征包括:
- 名字空间( Namespace )
- 类( Classes )
- 对象( Objects )
- 封装( Encapsulation )
- 重载( Overloading )
- 继承( Inheritance )
- 重写( Overriding )
- 界面( Interfaces )
- 多态( Polymorphism )
下面我们一起来逐一了解这些特征的简要意义:
** 名字空间( NameSpace ** ** ) **
名字空间即使被 .NET 平台广泛的应用,但其不是真正的 OOPS 特征,它只不过是各种不同类( Classes )的一个逻辑容器。名字空间下的类名必须是唯一的,名字空间有两个用途——为类提供逻辑组织和避免歧义性。
** 类( Classes ** ** ) **
类,仅仅是指“模板”或“ blue-print ”的一种定义。例如,你可以定义一个真实存在的类—— Employee , 这个类中包含有属性成员( Name, Age... )和行为( CalculateSalary, GoOnLeave... )。
** 对象 ** ** ( ** ** Objects ** ** ) ** ** **
类的实例叫做对象。例如,上面提到的 Employee 类可以包含有三个实例,它们描绘了具体的雇员—— John, Bob and Tom 。
** 封装( ** ** Encapsulation ** ** ) ** ** **
每一个对象( Objects )都是有代表性地分配一些数据或其他什么的。不是所有的数据都暴露在系统的外部,这些可以通过封装来控制。
** 重载( ** ** Overloading ** ** ) ** ** **
重载是指方法或函数可以使用相同的名字,但使用不同的参数名。参数的数据类型和个数可以改变。
** 继承( ** ** Inheritance ** ** ) ** ** **
继承是指类的延伸。它在任何时候对你的系统发展中的“对象模型”起到重要作用。 .NET 计划只支持单一的继承关系。
** 重写( ** ** Overriding ** ** ) ** ** **
重写是指方法在派生类中用跟父类相同(除了参数以外)的名字。
** 界面( ** ** Interfaces ** ** ) ** ** **
界面只不过是无需执行任何代码的类的属性和方法的模型。 类使用 Implement 关键字来执行界面。当一个类通过 Implements 关键字创建界面的时候,它必须执行所有的属性和方法(虽然这个动作是空的或者是无效的)。
** 多态( ** ** Polymorphism ** ** ) **
多型性是指系统使用相同的名字调用正确的任务的能力。
** 创建名字空间 **
创建名字空间使用关键字—— Namespace ( C# 里使用 namespace )。 下面的例子显示了怎样声明一个名字空间。
[VB.NET]
Namespace MyNamespace
...
End Namespace
[C#]
namespace MyNamespace
{
...
}
注意,一个集合可以有一个或多个名字空间,相反,一个名字空间可以跨越多个集合。你可以像下面例子一样创建名字空间巢。
[VB.NET]
Namespace MyNamespace
Namespace MuSubNamespace
...
End Namespace
End Namespace
[C#]
namespace MyNamespace
{
namespace MySubNamespace
{
...
}
}
如果你是使用 VS.NET 集成开发环境来创建解决方案,那么请使用默认的名字空间。
** 创建类 **
类的创建跟创建名字空间相似。
[VB.NET]
Public Class Class1
...
End Class
[C#]
public class Class1
{
...
}
类通常是一些名字空间的一部分。
** 创建属性 **
属性是类的封装数据成员,属性可以是读写、只读和只写。这是一个创建“读写”属性的例子:
[VB.NET]
Public Class Employee
private strName As String
Public Property Name As String
Get
return strName;
End Get
Set(value As String)
strName=value;
End Set
End Property
End Class
[C#]
public class Class1
{
public string Name
{
string strName;
get
{
return strName;
}
set
{
strName=value;
}
}
}
注意: 1 、 VB.NET使用Property关键字声明属性,C#使用这个关键字。
2、Property定义由Get和Set两部分组成,Get部分返回属性的值而Set部分是设置一些 private 变量。
3 、 Set 设置的值在 C# 里是通过隐含变量来调用这个值,而在 VB.NET 里允许你去改变这个值。
** 创建方法 ** ** **
方法描绘对象的行为。在 VB.NET 的 FUNCTION 和 SUB 块可以想方法一样被集体调用,在 C# 中任何事情都是函数。
[VB.NET]
Public Sub CalculateSalary()
...
End Sub
[C#]
public void CalculateSalary()
{
...
}
** 创建重载 **
方法重载是指调用同一方法名称使用不同的数据类型和它们的次序。下面的例子清晰的演示方法重载的创建:
[VB.NET]
Public Sub CalculateSalary()
...
End Sub
Public Sub CalculateSalary(month as Integer)
...
End Sub
[C#]
public void CalculateSalary()
{
...
}
public void CalculateSalary(int month)
{
...
}
注:使用 VB.NET 你也可以使用任意的参数去完成相似的功能,然而,微软推荐使用重载的方法。
** 继承 **
继承是延伸已有的类的一种能力。 .NET 允许单一继承而不象 C++ 那样允许并联的继承,这就意味着你在任何某一时刻只能从一个单一的类那里继承。
[VB.NET]
Public Class Manager
Inherits Employee
...
End Class
[C#]
public class Manager : Employee
{
...
}
在上面的例子中,我们建立了一个从父类 Employee 继承的派生类 Manager 象你能够猜到 Manager 是父类 Employee 的具体的实行一样。 VB.NET 使用 Inherits 关键字表示父类而在 C# 代码中使用“ : ”操作符。
** 方法重写 ** ** **
为了在子类里重写方法,必须在父类中的方法前标识 Overridable 关键字( VB.NET ) virtual 关键字( C# )。
[VB.NET]
Public Overridable Function CalculateSalary() As Integer
...
End Function
[C#]
public virtual int CalculateSalary()
{
...
}
然后,在子类中你可以创建一个方法使用相同的名字和指定重写的基类方法。
[VB.NET]
Public Overrides Function CalculateSalary() As Integer
...
End Function
[C#]
public override int CalculateSalary()
{
...
}
注意:如果你在子类中没有提供关键字 Overrides (VB.NET) 或 override (C#) 的话,那么,编译器会给出一个“ you are hiding a base class member ”的警告提示。当然了,你也可以输入 Shadows (VB.NET) 或 new (C#) 关键字来隐藏基类成员。
** 创建界面 ** ** **
象类是模板的生存期一样,界面可以是类的模板,相同地,他们是在对象模型里。
[VB.NET]
Public Interface IEmployee
Property EmployeeID() As Integer
Property Name() As String
Property Age() As Integer
Function CalculateSalary() As Integer
End Interface
[C#]
public interface IEmployee
{
int EmployeeID
{
get;
}
string Name
{
get;
set;
}
int Age
{
get;
set;
}
int CalculateSalary();
}
** 多态 **
下面一段作为讲解的例子:
[VB.NET]
Dim emp As Employee
emp = New Clerk()
Console.WriteLine
("Clerk Salary :{0}", emp.CalculateSalary())
emp = New Manager()
Console.WriteLine
("Manager Salary :{0}", emp.CalculateSalary())
[C#]
Employee emp;
emp=new Clerk();
Console.WriteLine
("Clerk Salary :{0}",emp.CalculateSalary());
emp=new Manager();
Console.WriteLine
("Manager Salary :{0