OOP技术特性

来源:互联网 发布:电子杂志用什么软件 编辑:程序博客网 时间:2024/06/03 03:19

包括:接口、继承、多态性、对象之间的关系、运算符重载、事件、引用类型和值类型。

运算符重载和事件在后面会介绍,先把其他的概念和区别理清楚

一、接口:

小编的理解就是定义一套规范,把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合。一但定义了接口,就可以在类中实现它。这样,类就可以支持接口所指定的所有属性和成员。

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

1.2接口的名称一般用大写字母I 开头。

1.3一个类可以支持多个接口,多个类也可以支持相同的接口。

1.4接口不包含实现代码。

可删除的对象

IDisposable 接口特别有趣。支持IDisposable 接口的对象必须实现其Dispose()方法,即它们必须提供这个方法的代码。当不再需要某个对象(例如,在对象超出作用域之前)时,就调用这个方法,释放重要的资源,否则,该资源会等到对垃圾回收调用析构方法时才释放。这样可以更好地控制对象所使用的资源。

C#允许使用一种可以优化使用这个方法的结构。using 关键字可以在代码块中初始化使用重要资源的对象,会在这个代码块的末尾自动调用Dispose()方法(特别是与数据库交互时会用到),用法如下:

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

...

using (<VariableName>)

{

...

}

或者把初始化时象<VariableName>作为using 语句的一部分:

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

{

...

}

在这两种情况下,可一在using 代码块中使用变量<VariableName>,并在代码块的末尾自动删除(在代码块执行完毕后,调用Dispose())。

二、继承:

继承是OOP 最重要的特性之一。任何类都可以从另一个类中继承,这就是说,这个类拥有它继承的类的所有成员。在OOP 中,被继承(继承的类也称为派生)的类称为父类(也称为基类)。注意,C#中的对象仅能直接派生于一个基类,当然基类也可以有自己的基类。

在继承一个基类时,成员的可访问性就成了一个重要的问题。派生类不能访问基类的私有成员,但可以访问其公共成员。不过,派生类和外部的代码都可以访问公共成员。,C#提供了第三种可访问性:protected,只有派生类才能访问protected 成员。对于外部代码来说,这个可访问性与私有成员一样:外部代码不能访问private 成员和protected 成员。

基类的成员可以是虚拟(虚拟方法)的,也就是说,成员可以由继承它的类重写。

基类还可以定义为抽象类。抽象类不能直接实例化。要使用抽象类,必须继承这个类,抽象类可以有抽象成员,这些成员在基类中没有实现代码,这些实现代码必须在派生类中提供。(注意抽象方法和虚方法的区别,抽象方法必须在派生类中重写,而虚方法没这要求)。

类可以是密封(seal)的。密封的类不能用作基类,所以没有派生类。

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

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

三、多态性:

继承的一个结构是派生于基类的类在方法和属性上有一定的重叠,因此,可以使用相同的语法处理从同一个基类实例化的对象。例如,如果基类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();

如果原始变量的类型不是Cow 或派生于Cow 的类型,这个强制类型转换就会引发一个异常。

在派生于同一个类的不同对象上执行任务时,多态性是一种极有效的技巧,其使用的代码最少。注意并不是只有共享同一个父类的类才能利用多态性。只要子类和孙子类在继承层次结构中有一个相同的类,它们就可以用同样的方式利用多态性。

还要注意,在C#中,所有的类都派生于同一个类object,object 是继承层次结构中的根。所以可以把所有对象看作是object 类的实例。这就是在建立字符串时,Console.WriteLine()可以处理无数多种参数组合的原因。第一个参数后面的每个参数都可以看作是一个object 实例,所以可以把任何对象的输出结果写到屏幕上。为此,需要调用方法ToString()(object 的一个成员),我们可以重写这个方法,为自己的类提供合适的实现代码,或者使用默认实现代码,返回类名(根据它所在的名称空间,返回类的修饰名)。

接口的多态性:

尽管不能像对象那样实例化接口,但可以建立接口类型的变量,然后就可以在支持该接口的对象上,使用这个变量访问该接口提供的方法和属性。

eg:Cow和Chicken 类实现这个接口

Cow myCow = new Cow();

Chicken myChicken = new Chicken();

IConsume consumeInterface;

consumeInterface = myCow;

consumeInterface.EatFood();

consumeInterface = myChicken;

consumeInterface.EatFood();

四、对象之间的关系:

继承是对象之间的一种简单关系,可以让派生类完整地获得基类的特性,而派生类也可以访问基类内部的一些工作代码(通过受保护的成员)。对象之间还有其他一些重要关系:

1)包含关系:一个类包含另一个类。这类似于世承关系,但包含类可以控制对被包含类的成

员的访问,甚至在使用被包含类的成员前进行其他处理。(用一个成员字段包含对象实例,就可以实现包含(containment)关系)

2)集合关系:一个类用作另一个类的多个实例的容器。这类似于对象数组,但集合有其他功能,包括索引、排序和重新设置大小等。

集合基本上是数组,数组与集合的主要区别是,集合通常实现额外的功能,例如Add()和Remove()方法可添加和删除集合中的项。而集合通常有一个Item 属性,它根据对象的索引返回该对象。不但如此,这个属性还允许更复杂的访问方式来实现。

五、引用类型和值类型:

在 C#中,数据根据变量的类型以两种方式中的一种存储在一个变量中。变量的类型分为两种:

引用类型和值类型,其区别如下:

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

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

5.1值类型和引用类型的一个主要区别是,值类型总是包含一个值,而引用类型可以是null,表示它们不包含值。

5.2只有string 和object 简单类型是引用类型,但数组也是隐式的引用类型。我们创建的每个类都是引用类型。

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

原创粉丝点击