.NET OOP
一、面向对象编程的含义
1.函数(过程化)编程常常导致单一的应用程序,即所有的功能都包含在几个代码模块中(常常是一个代码模块)
而使用OOP技术,常常使用许多代码模块,每个模块提供特定的功能,每个模块都是孤立的,甚至与其他模块完全孤立。这种模块化编程方法提供了非常大的多样性,打打增加了重用代码的机会。
(把更多的精力放在项目的设计阶段)
2.对象是从类型中创建的,对象的类型叫类。可以用类的定义实例化对象。类相当于汽车的模板或者用于构建汽车的规划,汽车本身是这些规划的实例,可以看做对象。
3.(1)可以通过属性和字段访问对象中包含的数据。这个对象数据可以用于区分不同的对象,因为同一个类的不同对象在属性和字段中存储了不同的值。
(2)属性不提供对数据的直接访问(可以更好地控制各种行为) 如果是字段,字段的取值范围仅由存储改该信息的类型来限制。
(3)可访问性:通常把字段设置为私有,通过公共属性访问他们,这样类中的代码就可以直接访问存储在字段中的数据,而公共属性禁止外部用户访问这些数据,以防他们在其中放置无效内容。
4.方法(对象中的函数)
方法参数带标识符in(不使用out和inout的情形).out(out).inout(ref)
5.一切皆对象
对象的生命周期(正在使用,构造阶段,析构阶段)
(1)(实例)构造函数:用new关键字调用。cupOfCoffee myCup = new cupOfCoffee();()中可填写参数
(2)析构函数:清理对象
6.静态和实力类成员(尚未理解)
(1)静态构造函数
(2)静态类
二、OOP技术
1.接口:把公共实例(非静态)方法和属性组合起来,以封装特定集合的一个功能。一旦定义了接口,就可以在类中实现它。这样,类就可以支持接口所指定的所有属性和成员。接口名称一般以I开头
把接口看做类的创建者和使用者之间的契约。。。
2.可删除的对象:
IDisposable接口。支持IDisposable接口的对象必须实现其Dispose()方法,即他们必须提供这个方法的代码。但不再需要某个对象是,调用方法释放重要资源。
using关键字可以在代码块中初始化使用重要资源的对象。会在代码块末尾自动调用Dispose()方法
<ClassName> <VariableName> = new <ClassName>();
...
using(<VariableName>)
{
...
}
或者
using(<ClassName> <VariableName> = new <ClassName>());
{
...
}
3.继承
被继承(派生)的类也成为父类(基类) C#中的对象仅能直接派生与一个基类
继承性可以从一个较一般的基类扩展或创建更多的特定类。
比如,一个代表农场家畜的类Animal,拥有EatFood()或Breed()等方法,我们可以创建一个派生类Cow,支持所有的这些方法,它也有自己的方法,入Moo()和SupplyMilk()。还可以创建另一个派生类Chicken,该类有Cluck()和LayEgg()方法。
派生类不能访问基类的私有成员,但可以访问公共成员。
第三种可访问性protected,只有派生类才能访问protected成员
外部成员不能访问protected和private成员
基类的成员可以是虚拟的,成员可以由继承它的类重写。 虚拟成员不能是私有成员
基类可以定义为抽象类。抽象类不能直接实例化。要使用抽象类,必须继承这个类,抽象类可以有抽象成员,这些成员在基类中没有实现代码,这些实现代码必须在派生类中提供。
所有对象都有一个共同的基类object。
4.多态性
8.2.3 多态性
继承的一个结构是派生于基类的类在方法和属性上有一定的重叠,因此,可以使用相同的语法
处理从同一个基类实例化的对象。例如,如果基类Animal 有一个EatFood()方法,则从派生于它的
类Cow 和Chicken 中调用这个方法,其语法是类似的:
Cow myCow = new Cow();
Chicken myChicken = new Chicken();
myCow.EatFood();
myChicken.EatFood();
多态性则更推进了一步。可以把某个派生类型的变量赋给基本类型的变量,例如:
Animal myAnimal = myCow;
不需要进行强制类型转换,就可以通过这个变量调用基类的方法:
myAnimal.EatFood();
结果是调用派生类中的EatFood()的实现代码。注意,不能以相同的方式调用派生类上定义的方
法,下面的代码不能运行:
myAnimal.Moo();
但是,可以把基本类型的变量转换为派生类变量,调用派生类的方法,如下所示:
Cow myNewCow = (Cow)myAnimal;
myNewCow.Moo();
(从一个派生类中实例化的所有对象都可以看作是其父类的实例)
5.接口的多态性
尽管不能像对象那样实例化接口,但可以建立接口类型的变量,然后就可以在支持该接口的对
象上,使用这个变量访问该接口提供的方法和属性。
例如,假定不使用基类Animal 提供EatFood()方法,而是把该方法放在IConsume 接口上。Cow
和Chicken 类也支持这个接口,唯一的区别是它们必须提供EatFood()方法的实现代码(因为接口不包
含实现代码),接着就可以使用下述代码访问该方法了:
Cow myCow = new Cow();
Chicken myChicken = new Chicken();
IConsume consumeInterface;
consumeInterface = myCow;
consumeInterface.EatFood();
consumeInterface = myChicken;
consumeInterface.EatFood();
这就提供了以相同方式访问多个对象的简单方式,且不依赖于一个公共的基类。例如,这个接
口可以由派生于Vegetable 的VenusFlyTrap 类实现,而不是由Animal 实现:
VenusFlyTrap myVenusFlyTrap = new VenusFlyTrap();
IConsume consumeInterface;
consumeInterface = myVenusFlyTrap;
consumeInterface.EatFood();
在这段代码中,调用consumeInterface.EatFood()的结果是调用Cow、Chicken 或VenusFlyTrap
类的EatFood()方法,这取决于哪个实例被赋予了接口类型的变量。
注意,派生类会继承其基类支持的接口。在上面的第一个示例中,要么是Animal 支持IConsume,
要么是Cow 和Chicken 支持IConsume。有共同基类的类不一定有共同的接口,反之亦然。
6.对象之间的关系(包含,集合)
包含关系:一个类包含另一个类。这类似于世承关系,但包含类可以控制对被包含类的成
员的访问,甚至在使用被包含类的成员前进行其他处理。
集合关系:一个类用作另一个类的多个实例的容器。这类似于对象数组,但集合有其他功
能,包括索引、排序和重新设置大小等。
7.运算符重载
为重载运算符编写代码,这段代码用作类定义的一部分,而该运算符作用于这个类
8.事件
使用事件可以创建事件驱动的应用程序
9.引用类型和值类型
在 C#中,数据根据变量的类型以两种方式中的一种存储在一个变量中。变量的类型分为两种:
引用类型和值类型,其区别如下:
值类型在内存的一个地方存储它们自己和它们的内容。
引用类型存储指向内存中其他某个位置(称为堆)的引用,而在另一个位置存储内容。
实际上,在使用C#时,不必过多地考虑这个问题。到目前为止,所使用的string 变量(这是引用
类型)与使用其他简单变量(大多数是值类型,例如int)的方式完全相同。
值类型和引用类型的一个主要区别是,值类型总是包含一个值,而引用类型可以是null,表示
它们不包含值。但是,可以使用可空类型(这是泛型的一种形式)创建一个值类型,使值类型在这个
方面的行为方式类似于引用类型(即可以为null)。这是一个高级论题,详见第12 章。
只有string 和object 简单类型是引用类型,但数组也是隐式的引用类型。我们创建的每个类都
是引用类型,这就是在这里说明这一点的原因。
结构类型和类的重要区别是,结构类型是值类型。
8.3 Windows应用程序中的OOP
第2 章介绍了如何在C#中创建简单的Windows 应用程序。Windows 应用程序非常依赖OOP 技
术,本节将论述OOP 技术,说明本章的一些论点。下面通过一个简单示例加以说明。
试一试:适用对象
(1) 在C:BegVCSharpChapter08 目录中创建一个新的Windows 应用程序Ch08Ex01。
(2) 使用“工具箱”(Toolbox)添加个新的按钮控件,使之位于Form1 的中央,如图8-12 所示。
(3) 双击按钮,为鼠标单击事件添加代码,修改代码,如下所示:
private void button1_Click(object sender, EventArgs e)
{
((Button)sender).Text = "Clicked!";
Button newButton = new Button();
newButton.Text = "New Button!";
newButton.Click += new EventHandler(newButton_Click);
Controls.Add(newButton);
}
private void newButton_Click(object sender, System.EventArgs e)
{
((Button)sender).Text = "Clicked!!";
}
}