黑马程序员_面向对象编程(OOP)技术
2013-06-17 17:32
639 查看
----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流!
----------------------
上文介绍了面向对象编程的一些基础知识,本文将继续阐述有关面向对象编程(OOP)技术,包括:
● 接口
● 继承
● 多态
● 对象之间的关系
● 运算符重载
● 事件
● 引用类型和值类型
一.接口
接口是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它。这样,类就可以支持接口所指定的所有属性和成员。
注意,接口不能单独存在。不能像实例化一个类那样实例化接口。另外,接口不能包含实现其成员的任何代码,而只能定义成员本身。实现过程必须在实现接口的类中完成。
一个类可以支持多个接口,多个类也可以支持相同的接口。所以接口的概念让用户和其它开发人员更容易理解其他人的代码。
在发布接口后,即接口可以用于其他开发人员或终端用户后,最好不要修改。
二.继承
继承是OOP最重要的特性之一,任何类都可以从另一个类中继承。在OOP中,被继承(也成为派生)的类称为父类(也称为基类)。注意,C#中的对象仅能直接派生于一个基类,当然基类也可以有自己的基类。
继承性可以从一个较一般基类扩展或创建更多的特定类。在继承一个基类时,成员的可访问性就成了一个重要的问题。派生类不能访问基类的私有成员,但可以访问其公共成员。不过,派生类和外部的代码都可以访问公共成员。为了解决这个问题,C#提供了第三种可访问性:protected,只有派生类才能访问protected成员。对于外部代码来说,这个可访问性与私有成员一样:外部代码不能访问private成员和protected成员。
三.多态性
继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,因此,可以使用相同的语法处理从同一个基类实例化的对象。例如,如果基类Animal有一个EatFood()方法,则从派生于它的类Cow和Chicken中调用这个方法,其语法是类似的:
Cow myCow=new Cow();
Chicken myChicken=new Chicken();
myCow.EatFood();
myChicken.EatFood();
多态性则更进了一步,可以把某个派生类型的变量赋给基本类型的变量,例如:
Animal myAnimal=myCow;
不需要进行强制类型转换,就可以通过这个变量调用基类的方法:
myAnimal.EatFood();
在派生于同一个类的不同对象上执行任务时,多态性是一种极有效的技巧,其使用的代码最少。注意并不是只有共享同一个父类的类才能利用多态性。只要子类和孙子类在继承层次结构中有一个相同的类,它们就可以用同样的方式利用多样性。
还要注意,在C#中,所有的类都派生于同一个类object,object是继承层次结构中的根。所以可以把所有对象看作是object类的实例。这就是在建立字符串时,Console.WriteLine()可以处理无数多种参数组合的原因。第一个参数后面的每个参数都可以看作是一个object实例,所以可以把任何对象的输出结果写到屏幕上。为此,需要调用方法ToString()(object的一个成员),我们可以重写这个方法,为自己的类提供合适的实现代码,或者使用默认实现代码,返回类名(根据它所在的名称空间,返回类的修饰名)。
四、对象之间的关系
继承是对象之间的一种简单关系,可以让派生类完整地获得基类的特性,而派生类也可以访问基类内部的一些工作代码(通过受保护的成员)。对象之间还有其它一些重要关系。
● 包含关系:一个类包含另一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员前进行其它处理。
●集合关系:一个类作用于另一个类的多个实例的容器。这类似于对象数组,但集合有其它功能,包括索引、排序和重新设置大小等。
五、运算符重载
我们已经知道了如何使用运算符处理简单的变量类型,也可以把运算符用于从类实例化而来的对象,因为类可以包含如何处理运算符的指令。
例如,给Animal添加一个新属性Weight,接着使用下述代码比较家畜的体重:
if(cowA.Weight>cowB.Weight)
{
...
}
使用运算符重载,可以在代码中提供隐式使用Weight属性的逻辑,如下面的代码所示:
if(cowA>cowB)
{
...
}
大于运算符>被重载了。我们为重载运算符编写代码,执行上述操作,这段代码用作类定义的一部分,而该运算符作用于这个类。在上面的示例中,使用了两个Cow对象,所以运算符重载定义包含在Cow类中。也可以重载运算符,以相同的方式处理不同的类,其中一个(或两个)类定义包含达到这一目的的代码。
注意,只能采用这种方式重载现有的C#运算符,不能创建新的运算符。
六、事件
对象可以激活事件,作为它们处理的一部分。事件是非常重要的,可以在代码的其他部分起作用,类似于异常(但功能更强大)。使用事件可以创建事件驱动的应用程序,许多基于Windows的应用程序完全依赖于事件。每个按钮单击或滚动条拖动操作都是通过事件处理实现的,其中事件是通过鼠标或键盘触发的。
七、引用类型和值类型
在C#中,数据根据变量的类型以两种方式中的一种存贮在一个变量中。变量的类型分为两种:引用类型和值类型,其区别如下:
● 值类型在内存的一个地方存储它们自己和它们的内容。
●引用类型存储指向内存中其它某个位置(称为堆)的引用,而在另一个位置存储内容。
实际上,在使用C#时,不必过多地考虑这个问题,对于初学者来说,所使用的string变量(这是引用类型)与使用其他简单变量(大多数是值类型,例如int)的方式完全相同。
----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流!
----------------------
详细请查看:http://edu.csdn.net
----------------------
上文介绍了面向对象编程的一些基础知识,本文将继续阐述有关面向对象编程(OOP)技术,包括:
● 接口
● 继承
● 多态
● 对象之间的关系
● 运算符重载
● 事件
● 引用类型和值类型
一.接口
接口是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合。一旦定义了接口,就可以在类中实现它。这样,类就可以支持接口所指定的所有属性和成员。
注意,接口不能单独存在。不能像实例化一个类那样实例化接口。另外,接口不能包含实现其成员的任何代码,而只能定义成员本身。实现过程必须在实现接口的类中完成。
一个类可以支持多个接口,多个类也可以支持相同的接口。所以接口的概念让用户和其它开发人员更容易理解其他人的代码。
在发布接口后,即接口可以用于其他开发人员或终端用户后,最好不要修改。
二.继承
继承是OOP最重要的特性之一,任何类都可以从另一个类中继承。在OOP中,被继承(也成为派生)的类称为父类(也称为基类)。注意,C#中的对象仅能直接派生于一个基类,当然基类也可以有自己的基类。
继承性可以从一个较一般基类扩展或创建更多的特定类。在继承一个基类时,成员的可访问性就成了一个重要的问题。派生类不能访问基类的私有成员,但可以访问其公共成员。不过,派生类和外部的代码都可以访问公共成员。为了解决这个问题,C#提供了第三种可访问性:protected,只有派生类才能访问protected成员。对于外部代码来说,这个可访问性与私有成员一样:外部代码不能访问private成员和protected成员。
三.多态性
继承的一个结果是派生于基类的类在方法和属性上有一定的重叠,因此,可以使用相同的语法处理从同一个基类实例化的对象。例如,如果基类Animal有一个EatFood()方法,则从派生于它的类Cow和Chicken中调用这个方法,其语法是类似的:
Cow myCow=new Cow();
Chicken myChicken=new Chicken();
myCow.EatFood();
myChicken.EatFood();
多态性则更进了一步,可以把某个派生类型的变量赋给基本类型的变量,例如:
Animal myAnimal=myCow;
不需要进行强制类型转换,就可以通过这个变量调用基类的方法:
myAnimal.EatFood();
在派生于同一个类的不同对象上执行任务时,多态性是一种极有效的技巧,其使用的代码最少。注意并不是只有共享同一个父类的类才能利用多态性。只要子类和孙子类在继承层次结构中有一个相同的类,它们就可以用同样的方式利用多样性。
还要注意,在C#中,所有的类都派生于同一个类object,object是继承层次结构中的根。所以可以把所有对象看作是object类的实例。这就是在建立字符串时,Console.WriteLine()可以处理无数多种参数组合的原因。第一个参数后面的每个参数都可以看作是一个object实例,所以可以把任何对象的输出结果写到屏幕上。为此,需要调用方法ToString()(object的一个成员),我们可以重写这个方法,为自己的类提供合适的实现代码,或者使用默认实现代码,返回类名(根据它所在的名称空间,返回类的修饰名)。
四、对象之间的关系
继承是对象之间的一种简单关系,可以让派生类完整地获得基类的特性,而派生类也可以访问基类内部的一些工作代码(通过受保护的成员)。对象之间还有其它一些重要关系。
● 包含关系:一个类包含另一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员前进行其它处理。
●集合关系:一个类作用于另一个类的多个实例的容器。这类似于对象数组,但集合有其它功能,包括索引、排序和重新设置大小等。
五、运算符重载
我们已经知道了如何使用运算符处理简单的变量类型,也可以把运算符用于从类实例化而来的对象,因为类可以包含如何处理运算符的指令。
例如,给Animal添加一个新属性Weight,接着使用下述代码比较家畜的体重:
if(cowA.Weight>cowB.Weight)
{
...
}
使用运算符重载,可以在代码中提供隐式使用Weight属性的逻辑,如下面的代码所示:
if(cowA>cowB)
{
...
}
大于运算符>被重载了。我们为重载运算符编写代码,执行上述操作,这段代码用作类定义的一部分,而该运算符作用于这个类。在上面的示例中,使用了两个Cow对象,所以运算符重载定义包含在Cow类中。也可以重载运算符,以相同的方式处理不同的类,其中一个(或两个)类定义包含达到这一目的的代码。
注意,只能采用这种方式重载现有的C#运算符,不能创建新的运算符。
六、事件
对象可以激活事件,作为它们处理的一部分。事件是非常重要的,可以在代码的其他部分起作用,类似于异常(但功能更强大)。使用事件可以创建事件驱动的应用程序,许多基于Windows的应用程序完全依赖于事件。每个按钮单击或滚动条拖动操作都是通过事件处理实现的,其中事件是通过鼠标或键盘触发的。
七、引用类型和值类型
在C#中,数据根据变量的类型以两种方式中的一种存贮在一个变量中。变量的类型分为两种:引用类型和值类型,其区别如下:
● 值类型在内存的一个地方存储它们自己和它们的内容。
●引用类型存储指向内存中其它某个位置(称为堆)的引用,而在另一个位置存储内容。
实际上,在使用C#时,不必过多地考虑这个问题,对于初学者来说,所使用的string变量(这是引用类型)与使用其他简单变量(大多数是值类型,例如int)的方式完全相同。
----------------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流!
----------------------
详细请查看:http://edu.csdn.net
相关文章推荐
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术05--运算符重载
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术02--继承
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术03--多态性
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术06--事件
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术07--引用类型和值类型
- 黑马程序员——IOS学习三:Objective-C的扩展OOP,类别,内存管理等——黑马 ios 技术博客
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术01--接口
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术04--对象之间的关系
- AOP技术应用和研究--OOP
- 黑马程序员_学习笔记:16) 反射技术
- 面向对象编程(OOP)基础之UML基础
- C#入门经典学习13-其他oop技术
- 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)
- 黑马程序员——外企Objective-C面试题(英语版)——黑马 ios 技术博客
- Qomolangma实现篇(六):Qomo的OOP框架的实现技术
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之02-Objective-C 编程环境概述——黑马 IOS 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之18-复制对象——黑马 IOS 技术博客
- 13--黑马程序员--技术总结之集合
- 黑马程序员——史上最全的iOS面试题及答案——黑马 IOS 技术博客
- 我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承