本章主要介绍C#中面向对象的相关知识。其中包括面向对象的基本概念、类的概念和使用方法,Visual Studio 2005中对面向对象的支持。C#中类的构成部分:包括属性和方法。在本章中还会介绍面向对象的一些高级概念包括抽象类、多态和接口等。
本章主要内容
& 面向对象中的类
& Visual Studio 2005对面向对象的支持
& 类中的属性
& 类中的方法
& 抽象类
& 多态
& 接口
类是面向对象概念中最基本的组成单位。
类是C#中功能最为强大的数据类型。像结构一样,类也定义了数据类型的数据和行为。程序员可以创建作为此类的实例的对象。C#中使用class关键字定义类。如下代码定义了一个名为MyClass的类:
class MyClass
{
}
类是一种强大的数据类型。开发人员除了可以应用C#中默认提供的数据类型外,还可以使用类创建自定义的数据类型。使用类,可以对现实中的任意类型进行建模。如可以定义一个汽车类,其代码如下:
class MyCar
{
}
上述的代码定义了一个汽车类,但现在该汽车没有任何特征,而且什么也不能做。考虑真实的汽车,显然汽车应该有颜色特征,还应该有重量特征。在类中可以定义这些静态的特征,只需将其定义在类代码的大括号之间即可。如下的代码为汽车类添加了颜色特征和重量特征:
class MyCar
{
string Color;
int Weight;
}
可以看到,汽车类的代码中又多了两个变量,分别是Color和Weight。这两个变量分别代表汽车的颜色和重量。在类的代码中可以根据实际情况添加类的静态特征,这些静态特征的声明可以是字段或属性。关于字段和属性的具体使用方法在后面的小节中还有介绍。读者此处只需了解类中可以对对象的静态特征进行描述。
现实中的对象即有静态特征,又有动态行为。如汽车类,虽然我们用静态特征描述了汽车的颜色和重量,但显然汽车最重要的性质就是其机动性。这里可以用Run表示汽车的机动性。如下的代码为汽车添加了动态行为“Run”:
class MyCar
{
string Color;
int Weight;
void Run()
{
Console.WriteLine(“汽车启动!”);
}
}
在类的实现中,上述代码中的Run以及其他的动态行为被称为类的方法,在后面的小节中还有介绍。在类代码中实现的静态行为,可以进行调用。如上面代码中的Run则可以用MyCar.Run()方法进行调用。
在上面的几个小节中我们已经创建了一个简单的类,即汽车类。下面通过一个实例演示创建类实例的方法。
创建一个Windows控制台应用程序,通过使用前面的MyCar类创建类的实例。
(1)创建一个名为ClassInstance的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace ClassInstance
{
class Program
{
static void Main(string[] args)
{
MyCar a = new MyCar();
a.Run();
}
}
class MyCar
{
string Color = "Red";
int Weight = 1000;
public void Run()
{
Console.WriteLine("汽车启动!");
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-1所示。
图6-1 运行结果
在上述实例中包含了MyCar即汽车类的完整代码。在Program类中创建了MyCar类的实例。创建实例的代码如下:
MyCar a = new MyCar();
如果有一个名为People的类,那么创建一个People类实例的代码应该如下所示:
People a = new People();
类的最大优点就是可以继承,这是面向对象的一项重要功能。如前面已经创建了一个汽车类MyCar,现在则要创建一个公共汽车类。这时可以想到,公共汽车是汽车的一种,具有所有汽车应该具有的性质,但又有其特殊之处。
这时可以使用面向对象中的继承,定义一个公共汽车类并使其继承汽车类的所有特性。然后再定义公共汽车特有的性质,这样就达到了代码重用的目的。首先借用前面小节中的MyCar代码:
class MyCar
{
string Color = "Red";
int Weight = 1000;
public void Run()
{
Console.WriteLine("汽车启动!");
}
}
接下来编写公共汽车的代码如下。
class MyBus : MyCar
{
}
显然,该公共汽车的类代码中什么功能都没有,也没有任何特性。但在类名MyBus的后面使用了一个冒号“:”,并且在后面紧跟着汽车类的类名MyCar。这种语法格式就被称为继承。下面充实一下MyBus类的代码并通过一个实例介绍继承的使用方法。
创建一个Windows控制台应用程序,通过使用前面的MyCar类演示继承的使用方法。
(1)创建一个名为ClassBus的控制台应用程序项目。
(2)修改Program.cs文件的内容如下:
namespace ClassBus
{
class Program
{
static void Main(string[] args)
{
MyBus a = new MyBus();
a.Run();
a.Start();
a.Stop();
}
}
class MyCar
{
string Color = "Red";
int Weight = 1000;
public void Run()
{
Console.WriteLine("汽车启动!");
}
}
class MyBus : MyCar
{
public void Start()
{
Console.WriteLine("公共汽车出站!");
}
public void Stop()
{
Console.WriteLine("公共汽车进站!");
}
}
}
按Ctrl+F5组合键运行程序,运行结果如图6-2所示。
图6-2 运行结果
上述实例中包含了MyCar即汽车类的完整代码和新编写的MyBus类代码。MyBus类代码中只包含Start和Stop两个行为,分别表示公共汽车出站和公共汽车进站。Program类中声明了一个MyBus的类实例a,并写下了如下的代码:
a.Run();
而在MyBus的代码中并没有包含Run的代码。运行时,该行代码产生了“汽车启动!”样式的输出。这样的情况完全依赖于面向对象中的继承,由于MyBus继承了MyCar,因此也继承了其行为。