一、面向對象設計的程序設計基礎
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關鍵字一起使用。