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关键字一起使用。

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页