C# 面向對象的程序設計 類 概念及設計詳述

一、面向對象設計的程序設計基礎

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關鍵字一起使用。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章