面向对象设计(一)——对象和类的理解

对象和结构体 1 1 对象和类 1 1 1对象的理解 在面向对象设计的过程中,我们把所有事物都会看成一个又一个的对象, 比如汽车,轮船,飞机,这些都是我

对象和结构体

1.1    对象和类

1.1.1对象的理解

在面向对象设计的过程中,我们把所有事物都会看成一个又一个的对象, 比如汽车,轮船,飞机,这些都是我们身边熟悉的对象,这些具体的对象也称为实例.那我们在设计过程中发现一些问题,比如张三的汽车,李四的汽车,王五的汽车,他们三个人都有汽车,我们发现这些汽车都是同一类型的,那么我们将他们抽象成一个类别,这个类别对象就是我们面向对象设计中的类,它实际上是一个抽象的类别对象, 而张三,李四,王五的汽车实际都是这个类别的一个个对象或者实例, 这样就不难理解下面的程序了.

class Car

{

}

class Program

{

static void Main(string[] args)

{

Car ZhangSanCar = new Car();

Car WangWuCar = new Car();

Car LiSiCar = new Car();

}

}

从上面的程序看,我们创建了一个类Car,  而张三,李四,王五具体的汽车对象或者实例 则是通过

Car ZhangSanCar = new Car();

Car WangWuCar = new Car();

Car LiSiCar = new Car();

这三条语句创建的.

1.1.2 对象的属性

上一节我们讲述了什么是对象,什么是实例, 什么是类 ,创建了一个类 Car ,但是这个类里面没有任何信息,那么这里面能包含哪些信息呢?首先包含的就是对象的属性.对象的属性实际上该对象含有数值的东西. 它是个名词.比如我们同样描述汽车, 汽车有发动机,有车轮,有重量,有长度,有宽度,有不同的类别. 这其中的名词是发动机,车轮,重量,长度,宽度,类别。在这些名词中含有数值的名词是重量,长度,宽度,类别,这些是汽车所含有的属性. 而发动机,车轮并不直接数值,这些则是对象,它们不应该放在属性中,但是发动机型号,车轮型号因其具有数值而当做汽车的属性。综上所述,我们要找到该对象的属性就可以通过文字描述从中提炼出含有数值的名词作为该对象的属性。通过上面的分析,我们来丰富一下汽车类的属性信息。

class Car

    {

        public double Weight;

        public double Lengh;

        public double Width;

        public double CarType;

        public double EngineType;

        public double TireType;

    }

一般C#的表示方法如下:

class Car

    {

        public double Weight

        {

            set;

            get;

        }

        public double Length

        {

            set;

            get;

        }

        public double Width

        {

            set;

            get;

        }

        public double CarType

        {

            set;

            get;

        }

        public double EngineType

        {

            set;

            get;

        }

        public double TireType

        {

            set;

            get;

        }

    }

1.1.3 对象的行为

    对象的行为指的是对象做了什么,可以做什么?对象的行为实际上是对象描述中的动词。比如我们同样描述汽车,我们开动汽车,加档,减档,停止汽车。这些都是汽车相关的一些动作。而这些动作就是对象的行为,它将抽象成为程序中的函数或者方法。下面我们来丰富一下汽车类的行为,按照上面的描述它包含了四个基本方法,开动,停止,加档,减档。

用程序实现如下:

        public void Start()

        {

            Console.WriteLine("汽车发动了");

        }

        public void Stop()

        {

            Console.WriteLine("汽车停了");

        }

        public void UpShift(int ShiftNum)

        {

            Console.WriteLine("汽车加了" + ShiftNum+"");

        }

        public void DownShift(int ShiftNum)

        {

            Console.WriteLine("汽车减了" + ShiftNum + "");

        }

1.1.4 构造函数和析构函数

1.1.4.1 构造函数和析构函数的理解

   类在实例化的时候内存自动会分配一部分空间给该实例,该实例中的一些属性数值必须要进行初始化,否则分配的空间就没意义了,于是乎就有了构造函数的东东。一开始建立这个类的时候,我们没发现有什么构造函数的东东,那是因为.NET自动的给这个类加了一个默认值进来,基本是默认为0,或者是null,实际上是站位符的意思,就是给类的相关属性设个值占个内存的位置。如果你不想用默认值来初始化那你也可以自己设置新的构造函数。

析构函数实际上是通知内存该类的实例已经结束历史使命了,不用再给我分配内存了,这时候该实例的内存就会被系统释放掉。这个析构函数也是.NET自动给这个类添加上的。以防止忘记写这个析构函数,导致内存没有释放掉,形成垃圾空间。

 

1.1.4.2 构造函数和析构函数的格式

    构造函数必须与包含它的类同名,析构函数前面加一个~一个前缀

public Car()

        {

            Weight = 5;

            Length = 20;

        }

        public Car(int ShiftNum)

        {

            Weight = 10;

            Length = 20;

            Console.WriteLine("汽车加了" + ShiftNum + "");

        }

~Car()

        {

        }

1.1.5 静态成员

 1.1.5.1 静态成员的理解

为什么会有静态成员这个概念呢?实际上这是面向过程的编程思想的遗留问题。以前在面向过程的编程中总是把一些全局变量或者希望程序在运行开始就进行初始化的函数或者属性值都将其声明为静态成员。这种静态成员是从程序的运行开始到结束都会存在于内存之中的。在面向对象的编程思想中保留了静态成员的概念,因为在新的编程思想中同样有全局变量,也同样有希望运行开始就进行初始化赋值的函数或者属性。只不过面向对象的编程中,静态成员的种类更为丰富了。它会有静态方法,静态构造函数,静态属性,静态类等。

1.1.5.2 静态属性和方法

在类的定义中如果你希望将某些属性或者方法在程序运行开始的时候就初始化了,而不需要等到该类实例化的的时候再进行初始化,那么你就需要将这个属性或者方法设定成静态的。设置成静态的方法很简单,就是在属性或者方法名之前加一个static前缀就可以了。那如何引用它呢?记住直接用类名.属性或者方法的方式来引用。为什么呢?很简单了,静态的属性和方法在创建类的时候就已经在内存中有了,而不需要实例化后才有的,因此直接引用就可以了,没必要实例化后再引用,而且从内存的角度来看,静态的内存保存地方与实例化的实例保存的地方是不一样的,如果用实例来引用它就会出现错误的了。

下面是静态方法的使用方法。

class Car

    {

        public double Weight

        {

            set;

            get;

        }

        public static void Start()

        {

            Console.WriteLine("汽车发动了");

        }

       

    }

    class Program

    {

        static void Main(string[] args)

        {

            Car WangWuCar = new Car();

            Console.WriteLine(WangWuCar.Weight);

            Car LiSiCar = new Car();

            Car.Start();

            Console.ReadKey();

        }

    }

1.1.5.3 静态类

静态类的作用是将所有的静态方法和属性全部放在其中进行统一声明的类。比如下面的方法实现

public static class Class1

    {

        public static void WriteText()

         {

             Console.WriteLine("汽车加了档");

         }

    }

class Program

    {

        static void Main(string[] args)

        {

            Class1.WriteText();

            Console.ReadKey();

        }

    }

 

1.1.6  类的关键字理解

    类为什么要有这些关键字呢?实际上是为了区分类的不同作用,比如我们需要设计一个类,通常该类是任何项目中的类或者函数可以访问或者引用它,则用public关键字来表示,但是我们又设计一个类,我们希望它只能被同一个项目中的其他类或者函数所引用,其他项目中的其他类或者函数不能引用,那么这该怎么办呢?面向对象的方法中出现了internal关键字来区别这种情况的类。除了这些情况,我们还有其他情况,不同的情况用不同的关键字来区别它。下面我们来详细讲述这些关键字的作用

l  Public

这个关键字指的是任何项目中的类或者函数都可以引用或者访问它。

l  Internal

这个关键字指的是该类当前项目中的其他类或者函数可以引用或者访问它,但是其他项目中的类或者函数都不可以引用或者访问它。

l  Abstract

这个关键字指的是只能由当前项目中的类或者函数可以引用或者访问它,同时该类不能实例化,但是可以继承。

l  Sealed

这个关键字指的是只能由当前项目中的类或者函数可以引用或者访问它,同时该类可以实例化,但是不可以派生。

l  Public abstract

这个关键字指的是任何项目中的类或者函数都可以引用或者访问它,同时该类不能实例化,但是可以继承。

l  Public sealed

这个关键字指的是任何项目中的类或者函数都可以引用或者访问它,同时该类可以实例化,但是不可以派生。

1.1.7  类的成员关键字理解

为什么要有类的成员关键字呢?实际上就是为了区分各个成员的受访范围。比如我们希望该属性只能由当前类中的成员访问它,其他类的成员不能访问它,我们就可以用private关键字来区别它。下面我们详细介绍一下类成员的几个关键字

l  Public

该成员可以由任何类的成员来访问它

l  Private

该成员可以由当前类的成员来访问它

l  Internal

该成员只能由本项目或者程序集内部的成员来访问。

l  Protected

该成员只能由当前类或者派生类成员来访问。