首页 > 代码库 > 【设计模式】面向对象基础
【设计模式】面向对象基础
最近一直在学习《大话设计模式》根据师傅对我的指导,让我先学习这本书的附录——面向对象基础。说实在话,面向对象技术从很早就接触了,从刚开始的C++,其次是软工视频,然后是UML,紧接着是C#,直到现在的设计模式。。
总的来说,在设计模式之前,我对面向对象的了解还只是停留在封装、继承、多态的层次上,虽然在C#视频中,有全面的讲解了一下,但是自己还是晕晕乎乎的,脑子中还是有很多疑云。。直到这次的设计模式,通过通过幽默生动、而又通俗易懂的故事,对面向对象技术深入浅出,我才算是真正的入门了。。
这篇博客的主要内容,是面向对象的基础知识。首先,我要罗列一下书中故事的内容:
目的:实现“动物运动会”
“猫叫”——————————“喵”的提示框———————————类的作用
起名字——————————“名字”提示框———————————构造函数
当没有名字时———————“无名”提示框———————————方法重载
猫叫次数—————————“喵。。”的提示框—————————属性与修饰符(房子的比喻)
猫叫转变为狗叫———————————————————————类的封装
猫与狗都是动物——————动物类——————————————继承
举办“叫声比赛”——————“动物报名”————————————数组、多态
Shout方法—————————只是声音不同——————————重构(再抽象)
动物类不能实例化——————————————————————抽象类
叮当、孙悟空“变东西”———特殊行为—————————————接口
“动物报名”数量——————用数组,最多五个————————集合的作用
什么对象都接受——————类型不安全——值类型装、拆箱——泛型
听见猫叫,老鼠就跑—————————————————————委托与事件,及其关系通过以上的罗列,让我对所学的内容,在故事的引导下,使知识更有联系性。。
下面,是我面向对象知识的罗列:
类与实例
对象:是一个自包含的实体,用一组可识别的特性和行为来识别。我们所看到的、感觉到的、听到的任何东西都可以是对象。对象的实例化就是指出具体的东西。。
类:是具有相同属性和功能的对象,进行抽象的集合。
构造方法
又叫构造函数,其实就是对类进行初始化。构造函数与类同名,无返回值,不需要void,在new时候调用。
方法重载
提供了创建同名的多个方法的能力。方法重载时,两个方法必须要相同名称,但参数类型或个数必须要有所不同,否则重载就没有意义了。
重载的好处是,可在不改变原方法的基础上,新增功能。
属性与修饰符
字段是类为满足其设计所需要的数据,字段都是私有变量,属性都是共有变量。
属性中有两个方法get、set。get表示外界调用时,可以得到内部字段的值;set表示外界可
以给内部字段赋值,它没有显示设置参数,但有一个隐式参数,用关键字value表示。
封装
好处:1、良好的封装能减少耦合
2、类内部的实现可以自由修改
3、使类具有清晰的对外接口
继承
如果子类继承父类,1、拥有父类非private的属性和方法
2、可扩展父类没有的属性和方法
3、以自己的方式实现父类的方法(方法重写)
4、不能继承构造函数,只能调用
5、调用父类成员,可用base关键字
重构
改善既有代码的设计
多态
表示不同的对象可以执行相同的动作,但要通过自己的代码来实现。
特点:1、子类以父类的身份出现
2、子类在执行时,以自己的方式来实现
3、子类以父类的身份出现时,子类特有的属性和方法不可以使用
抽象类
将不能实例化的类定义为抽象类,加关键字abstract
特点:1、不能实例化
2、抽象方法是必须被子类重写的方法
3、如果类中包含抽象方法,那么类必须定义为抽象类
接口
使用:1、不能实例化,不能有构造函数和字段
2、接口,以及它的属性和方法,都不能有修饰符
3、不能声明虚拟或静态
4、实现接口的类必须实现接口中的所有方法和属性
5、一个类可支持多个接口,多个类也可以支持相同的接口
6、接口的命名,前面要加一个大写的字母“I”
与抽象类的区别:1、抽象类可以有成员的实现,接口没有
抽象类的抽象成员可被子类,部分实现;接口的成员要完全实现
一个类只能继承一个抽象类,但可实现多个接口
2、类是对对象的抽象;抽象类是对类的抽象;接口是对行为的抽象
3、抽象类是从子类中发现公共的东西,泛化出父类;接口是根本不知道子类的存在,方法如何实现还不确定,预先定义。(抽象类是自底而上,接口是自顶向下)
集合
.NET Framework提供了用于数据存储和检索的专用类,这些类统称为集合。这些类提供对堆栈、列队、列表和哈希表的支持。大多数集合类实现相同的接口。
现在最常用的是ArrayList。它是命名空间System.Collections下的一部分,它是使用大小可按需动态增加的数组实现IList。
好处:1、根据使用大小,按需动态增加
2、可随意添加、插入或移除某一范围的元素
缺点:1、集合类型不安全,不管是什么类型的对象都能接受。
2、ArrayList对于存放值类型的数据,比如int、string等,用ArrayList就意味着都需要将值类型装箱为Object对象,当使用时,还需要执行拆箱操作,这就带来了很大的性能损耗
泛型
泛型能很好地解决集合所出现的问题。泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型和其方法的参数类型出现。
泛型集合需要System.Collections.Generic命名空间,用List替换ArrayList。该类使用大小,可按需动态增加的数组实现IList泛型接口。
List和ArrayList在功能上是一样的,不同就在于,它在声明和实例化时都需要指定其内部项的数据或对象类型,这就避免了刚才讲的类型安全问题和装箱拆箱的性能问题。
委托与事件
委托是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。
委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。
委托对象用关键字delegate来声明;而事件是说在发生其他类或对象关注的事情时,类或对象可通过事件通知它们。事件对象用event关键字声明。
小结
以上的所有都是我对知识的罗列,虽然是罗列,但都是基础。所谓的学习就是在知识的基础上,不断地对知识进行总结,融入自己的生活和知识网。
所以说,我非常赞同米老师对于学习的理解。就学习本身而言,它是一项非常简单的事情:罗列知识点——总结知识——实践——再总结,我们要不断地循环这条知识链,在这期间要使用米老师的学习方法和时间管理思想。
我想,真正难的是自身的执行力和毅力,这是我的弱点,也是我进步的必要元素。。下一篇文章《【设计模式】面向对象小结》
【设计模式】面向对象基础