一、面向对象设计的程序设计基础
1.1、面向对象的程序设计
(1)什么是面向对象的程序设计
C语言中,设计出来的应用程序过于单一,因为所有功能都被包含在几个甚至一个代码块中,而这些代码块只能服务于单一的程序。因此,为了增加这些代码块的重用机会,以完成更多的程序,就要使用面向对象的程序设计方法。
面向对象的程序设计可使每一个计算机应用程序由一个个单一的、能起到字程序作用的对象(或称单元)组合而成。
(2)类和对象的概念
面对对象的程序设计是一种以对象为基础、以事件为驱动的编程技术。对象是程序的基本元素,事件及其处理程序建立了对象之间的关联。
A、类
生活中有无数多的实体,如人、车、植物等,每个实体都有一系列的性质和行为。例如,一辆车就可以定义其颜色、型号等性质,还能定义其前进、后退等行为。在面向对象设计中,针对某个实体性质和行为的具体定义就称为类(class)。
B、对象
对象是对象编程技术的核心,是构成应用程序的基本元素。在类中,每个对象都是该类的一个实例。如,人类是人这个实体中的类,而每个不同的人就是人类的对象。每个人有不同的身高、体重等性质以及起立、行走等行为。在面对对象的程序设计中,对象的性质称为属性,对象上发生的事件称为事件,针对某个事件产生的行为称为方法。
属性、方法和事件构成了对象的三要素。
(3)、预定义类
刚开始学习的控件、用户自定义的窗体、数据类型都是.NET Framework提供的,称为预定义类。
1.2、封装和隐藏
封装是指将成员有机地组织在一个类中。C#中,类的成员包括数据成员、属性、方法和事件。类是实现封装的工具,封装保证了类有良好的独立性。
(1)定义类
C#中,类是通过class定义的。例如,创建的Windows窗体应用程序时所建立的窗体Form1就是一个class关键字定义的类。
自定义类的通用格式如下:
class 类名
{
//定义数据成员
//定义属性
//定义方法
//定义事件
}
(2)定义类成员
在类的定义中,也提供了类中所有成员的定义,包括数据、属性、事件、方法。可通过以下修饰符定义:
修饰符 | 意义 |
public | 类成员可以由任何代码访问 |
private | 类成员只能由类中的代码访问,定义成员上时,默认使用private |
protected | 类成员只能由类或其派生类(即子类)中的代码访问 |
A、定义数据成员
类的数据成员通过标准的变量声明语句定义,并结合访问修饰符来指定数据成员的访问级别。为起保护作用,数据成员一般以private和protected修饰符声明。
class vehicle
{
private int wheels; //车轮数
private float weight; //车重量
}
B、定义方法
类的方法通过标准的函数声明语句定义,并结合访问修饰符来指定方法的访问级别。
public class Vehicle
{
private int wheels;
private float weights;
public void SetVehicle(int wheels,float weights) //定义方法SetVehicle设置车轮数和车重量
{
this.wheels = wheels;
this.weights = weights;
}
public void GetVehicle() //定义方法GetVehicle()获得车轮数和车重量
{
MessageBox.Show("车轮数:" + this.wheels.ToString() + "\n车重量:" + this.weights.ToString());
}
}
private void button1_Click(object sender, EventArgs e)
{
int wheels;
float weight;
wheels = int.Parse(textBox1.Text);
weight = float.Parse(textBox2.Text);
Vehicle v = new Vehicle();
v.SetVehicle(wheels, weight);
v.GetVehicle();
}
在SetVehicle()方法中,有两组wheels和weight变量。一组为Vehicle的2个数据成员wheels和weight赋值,而GetVehicle
(3)定义属性
C#中能定义类的属性:一个用于设置属性值,用关键字set来定义;另一个用于获取属性值,用get关键字定义。可以忽略其中一个代码块用来设置只读或只写属性。
访问修饰符 数据类型 属性名
{
set
{
... //属性的set代码块
}
get
{
... //属性的get代码块
}
}
namespace WindowsFormsApplication12
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
float x, y;
string msg1, msg2;
x = float.Parse(textBox1.Text);
y = float.Parse(textBox2.Text);
Point p = new Point();
p.MyX = x;
p.MyY = y;
msg1 = "您输入的坐标为(" + p.MyX.ToString() + "," + p.MyY.ToString() + ")";
label3.Text = msg1;
msg2 = p.ReadXY;
MessageBox.Show("您输入的坐标为" + msg2 + "!");
}
}
class Point
{
private float x; //x坐标
private float y; //y坐标
public float MyX //定义属性MyX
{
set
{
x = value; //提供对数据成员x的赋值
}
get
{
return x; //提供对x的访问
}
}
public float MyY
{
set
{
y = value;
}
get
{
return y;
}
}
public string ReadXY
{
get
{
return "(" + x + "," + y + ")";
}
}
}
}
属性实际上提供了对类中私有数据成员的一种访问方式。属性的定义不仅仅解决了对数据成员的访问问题,更能提供强大的操作控制。
1.3、对象及其成员的访问
在面向对象的程序设计中,必须遵守“先定义、后使用”的原则,即任何预定义或自定义的类都必须实例化称对象后才能使用。
(1)对象的声明
类型 对象名=new 类名();
(2)成员的访问
类中定义的成员通常需要通过对象才能访问,对不同类型的数据成员,其访问形式也不同。
数据成员:对象.数据成员
属性:对象.属性
方法:对象.方法
事件:较复杂,可参看MSDN官方帮助文档
例:建立一个student类,可通过read()方法读入数据,通过write方法输出数据。
namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{
string id, name;
float score;
Console.Write("请输入学号:");
id = Console.ReadLine();
Console.Write("请输入姓名:");
name = Console.ReadLine();
Console.Write("请输入得分:");
score = float.Parse(Console.ReadLine());
student s = new student();
s.SetInfo(id, name);
s.MyScore = score;
Console.WriteLine("\n======以下是输出=======\n");
Console.WriteLine(s.OutPut());
Console.WriteLine("\n按下任意按键结束程序:");
Console.ReadKey();
}
}
class student
{
private string sId; //学号
private string sName; //姓名
private float score; //分数
public void SetInfo(string sId,string sName) //定义方法SetInfo()设置学号和姓名
{
this.sId = sId;
this.sName = sName;
}
public float MyScore //定义属性MyScore
{
set
{
score = value;
}
get
{
return score;
}
}
public string OutPut() //定义方法OutPut,提柜对所有数据成员的格式化输出
{
return "学号:" + sId + " 姓名:" + sName + " 得分:" + score;
}
}
}
1.4 构造函数和析构函数
(1)构造函数
构造函数可以在声明对象的同时对数据成员赋值。声明对象时与new关键字一起使用。