c#入门经典笔记第八章

面向对象编程

一、什么是面向对象编程

   要理解对象的含义,要和类相联系,如果用“车”代表一个父类,自行车,汽车,卡车是子类,那么具体的车,就是一个对象。

  1、一个对象中包含属性和字段,可以通过它们访问对象中包含的数据。但属性不提供对数据的直接访问。

  2、方法表示对象中的函数

  3、一切皆对象。C#和.NET Framework中的所有东西都是对象:Main()函数就是类的一个方法,每个变量类型都是一个类,每个命令都是一个属性或方法。

  4、对象的生命周期。两个重要的阶段

    (1)构造函数

      使用new关键字来调用构造函数。例如,一下方式,通过其默认的构造函数实例化一个CupOfOffice对象

      CupOfOffice myCup = new CupOfOffice();

    构造函数可以公共或私有的,类外部的代码不能使用私有构造函数实例化对象,有一写类没有公共的构造函数。

    (2)析构函数

      用来清理对象,

  5、静态和实例类成员。

    静态成员(可以成为共享成员)可以在类的实例之间共享,所以可以将它们看做是类的全局对象。静态属性和静态字段可以访问独立于任何对象实例的数据,静态方法可以执行与对象类型相关、但与对象实例无关的命令。在使用静态成员时,甚至不需要实例化对象。

    例如,前面使用的Console.WriteLine()和Convert.ToString()方法就是静态的,根本不需要实例化Console或Convert类(如果试着进行这样的实例化,操作就会失败,因为这些类的构造函数是不可以公共访问的)

    使用类中的静态成员时,需要使用静态构造函数预先初始化这些成员。一个类 只能有一个静态构造函数,该构造函数不能有访问修饰符,也不能带任何参数。它只能在下列情况下调用:

    (1)创建包含静态构造函数的类实例时  

    (2)访问包含静态构造函数的类的静态成员时

    在这两种情况下,会先调用静态构造函数,之后实例化类或访问静态成员,无论创建了多少个类实例,其静态构造函数都只调用一次。

    6、静态类。如果希望类只包含静态成员,且不能用于实例化对象,可以使用静态类。静态类只包含静态成员,不需要实例构造函数,但可以有一个静态构造函数。

二、oop技术

   1、接口。接口是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它,这样类就可以支持接口所指定的所有属性和成员。所以不允许声明成员上的修饰符,即使是pubilc都不行,因为接口成员总是公有的,也不能声明为虚拟和静态的。如果需要修饰符,最好让实现类来声明。

  接口不能单独存在,不能像实例化一个类那样实例化接口,接口不能包含实现其成员的任何代码,而只能定义成员本身。实现过程必须在实现接口的类中完成。

  接口一般用大写字母I开头。

  ※接口也可以继承自其他接口,与类不同的是,接口可以继承多个接口(与类可以支持多个接口的方式类似)

  2、可删除的对象。调用IDisposable接口的Dispose方法,可以释放对象所控制的资源。

  3、using关键字可以在代码块中初始化使用重要资源的对象,会在这个代码块的末尾自动调用Dispose方法。

  <ClassName> <VariableName> = new <ClassName>()

  ...

  using(<VariableName>)

  {...}

  或

  using (<ClassName> <VariableName> = new <ClassName>())

  4、继承。

  (1)保护级别。派生类不能访问基类的司私有成员,派生类和外部代码都可以访问公共成员。只有派生类可以访问protected成员,对外部代码来说,protected的可访问性和私有成员一样。

  (2)继承行为。①基类的成员可以是虚拟的,由继承它的类重写。②基类还可以是抽象类,抽象类不能直接实例化,要使用抽象类,必须继承这个类 ,抽象类可以有抽象成员呢,这些成员在基类中没有实现代码,这些实现代码必须在派生类中提供,但抽象类也可以提供成员的实现代码,不能实例化抽象类,并不意味着不能再抽象类中封装功能。③类可以是密封(seal)的,密封的类不能用作基类,所以没有派生类。

  (3)在c#中,所有的对象都有一个共同的基类object(在.NET Framework中,它是System.Object类的别名)

  5、多态性。
      (1)多态是面向对象编程中三大机制之一,其原理建立在"从父类继承而来的子类可以转换为其父类"这个规则之上,换句话说,能用父类的地方,就能用该类的子类.当从父类派生了很多子类时,由于每个子类都有其不同的代码实现,所以当用父类来引用这些子类时,同样的操作而可以表现出不同的操作结果,这就是所谓的多态.(转自:kychen88一句话描述:通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态.(from:shuzhiguoxing)

  在C#中所有的类都派生于同一个类object。

  从一个派生类中实例化的所有对象都可以看做是其父类的实例。

  (2)接口的多态性。尽管不能像对象那样实例化接口,但可以建立接口类型的变量。之后就可以在支持该接口的对象上,使用这个变量访问该接口提供的方法和属性。比如EatFood()方法放在IConsume接口上,Cow和Chichen类也支持这个接口,它们必须提供EatFood()方法的实现代码(因为接口不包含代码),接着就可以使用下述代码访问该方法了。

  例:Cow myCow = new Cow();

    Chichen myChichen = new Chichen();

    IConsume consumeInterface;

    consumeInterface = myCow;

    consumeInterface.EatFood();

    consumeInterface = myChichen;

    consumeInterface.EatFood;

  6、对象之间的关系。

  (1)包含关系

    

  (2)集合关系

    数组可以存储多个同类变量,这也适用于对象。集合基本上是数组。 

    例: Animal[] animals = new Animal[5];

  7、运算符重载。可以把运算符用于从实例化而来的对象,因为类可以包含如何处理运算符的指令。例如,给Animal添加一个新属性Weight。使用下述代码比较家畜的体重。

  if(cowA.Weight > cowB.Weight)

  {...}

  使用运算符重载,可以在代码中提供隐式使用Weight属性的逻辑,如下:

  if(cowA > cowB){...}

  8、事件。对象可以激活事件,作为它们处理的一部分。

  9、引用类型和值类型。

  变量类型分为两种:值类型和引用类型。

    值类型:在内存中的一个地方存储它们自己和它们的内容。

    引用类型:存储指向内存中其他某个位置(成为堆)的引用,而在另一个位置存储内容。

  两种类型的区别是:值类型总是包含一个值,而引用类型可以是null,但是可以用控类型(泛型的一种个)创建一个值类型。

    结构类型和类的重要区别是:结构类型是值类型。

三、WindowsForm程序对oop的依赖关系

   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2013-10-01 15:04  w-l  阅读(581)  评论(0编辑  收藏  举报