设计模式开篇-面向对象基础回顾

前段时间一直在看设计模式,大致看了一遍,基本上是能看懂,不过看的过程中基础知识的不牢固,让我在看的过程中感觉很难受,所以这几天趁着假期,把面向对象的一些基础知识及时的补了补。感觉现在看完这些基础知识之后跟最初刚学的时候理解的更加深入,记忆也更加深刻了。于是,就想以这个为开篇,写一个设计模式的学习系列,将自己的所看所想所感通过文字的形式讲出来,一方面加深自己的印象,另一方面希望能对其他人产生一定的帮助。

一、类与对象

       万物皆对象,任何讲面向对象的书里边都会有这样的一句话。比较正式的解释就是对象就是可以用一组可识别的特性和行为来标识的一个自包含的实体。那么类就是具有相同属性和功能的对象的抽象的集合。通常用class关键字类定义类,这里要注意两点:第一,类名称首字母要大写,多个单词则各个首字母大写;第二,对外公开的方法需要用‘public’修饰符

二、实例化与构造函数

      说完类与对象,那么就不得不说类的实例化。实例,就是一个真实的对象,实例化就是创建对象的过程,使用new关键字来创建。在创建对象的过程中,我们会用到一个方法-构造方法(构造函数),该方法就是对类进行初始化的,构造方法与类同名,无返回值,也不需要void,在new的时候自动调用所有的类都有构造方法,如果你不编码则系统默认生成空的构造方法,若你定义了构造方法,那么默认的构造方法就会失效。

三、属性与修饰符

      首先我们要记住定义类的时候,一般都要定义属性方法(C#叫法)或者成员变量成员方法(C++叫法)。所谓属性就是一个方法或者一对方法(get/set)在调用它的代码看来,它是一个字段,即属性适合于以字段的方式使用方法调用的场合字段是存储类要满足其设计所需的数据字段是与类相关的变量(成员变量,C++叫法)。

      在定义这些属性和方法的时候,我们要考虑其的访问权限,那么此时我们要用到修饰符来限定属性和方法的访问权限。常用的修饰符有:private、public、protectedpublic表示它所修饰的类成员可以允许其他任何类来访问即共有的;private表示只允许同一个类中的成员访问,其他类包括子类、实例对象无法访问即私有的;protected表示继承时子类可以对基类有完全访问权即用protected修饰的类成员,对子类公开,但不对其他类公开。

      属性有两个方法get/setget访问器返回与声明的属性相同的数据类型,表示的意思是调用时可以得到内部字段的值或引用;set访问器没有显示设置参数,但它有一个隐式参数,用关键字value表示,它的作用是调用属性时可以给内部的字段或引用赋值。为什么不把字段修饰为public呢?这样就可以不用get/set方法了。之所以这么设计是因为对于对外界公开的数据,我们希望能够更多的控制,这就好像我们的房子,我们并不希望房子是全透明的,那样你在家所有的活动全部被看的清清楚楚,毫无隐私可言。通常我们的房子有门有窗,更多的是不透明的墙。门和窗是public,房子内部的东西是private,对于这个房子来说,门窗是可以控制的,我们并不是让所有人都可以从门随意进出,这就是属性的作用。如果我们把字段是为public,那么任何时候,调用者都可以读取或写入,这是非常糟糕的。

三、重载、重写(覆盖)、隐藏(重定义)、重构

      方法重载提供了创建同名的多个方法的能力,但这些方法需要使用不同的参数类型,即方法重载时,两个方法必须要方法名相同,参数类型或者个数必须要有所不同。方法重载可在不改变原方法的基础上,新增功能

      方法重写是在继承时发生且发生在子类和父类之间,即在子类中重新定义父类中的虚方法,访问父类或子类的该方法时均调用的子类的重写方法。重写发生的前提是父类函数为虚函数(函数前面加virtual修饰的为虚函数),子类在重写的时候要在函数前面加override。

      隐藏是指发生在子类和父类之间,函数名相同,不能构成重写的都是重定义。重定义的不光是类的成员函数,还可以是类的成员变量。如果在父类和子类中有相同名字的成员方法,但该方法没有声明为virtual和override,那么在子类中会将父类的成员隐藏,隐藏后的直接效果就是:访问父类调用父类的方法,访问子类调用子类的方法。C#中使用关键字new声明我们要隐藏一个方法。

      重构就是改善既有代码的设计,让代码更加的符合面向对象规则。

四、封装

      封装,面向对象的三大特性之一。所谓封装即每个对象都包含它能进行操作所需要的所有信息,因此对象不必依赖其他对象来完成自己的操作。封装的优点:(1)良好的封装能够减少耦合(2)类内部的实现可以自由的修改(3)类具有清晰的对外接口。

五、继承

      对象的继承代表了一种‘is-a’的关系,如果两个对象A和B,可以描述为“B是A”,则表明B可以继承A。实际上,继承者还可以理解为是对被继承者的特殊化,因为它除了具备被继承者的特性外,还具备自己独有的个性。所以,当B可以继承A时,我们可以说“B是A”,但不能说“A是B”。继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,其中子类继承父类的所有特性(即使有private、public等的修饰也能继承下来,只不过是能不能访问的问题),子类不但继承了父类的所有特性,还可以定义新的特性。总结为三句话为:如果子类继承于父类(1)子类拥有父类非private的属性和功能(2)子类具有自己的属性和功能(3)子类还可以以自己的方式实现父类的功能(方法重写)

      不用继承的话,如果要修改功能,就必须在所有重复的方法中修改。代码越多,出错的可能性就越大,而继承的优点是,继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,这就避免了重复,另外,继承可使得修改或扩展继承而来的实现都较为容易。继承是有缺点的,那就是父类变,则子类不得不变。继承会破坏封装,父类的实现细节暴露给子类,增加了两个类之间的耦合性,继承显然是一种类与类之间的强耦合的关系。当两个类之间具备‘is-a’的关系时,就可以考虑使用继承了。

注意:(1)protected表示继承时子类可以对基类有完全访问权限,即用protected修饰的类成员,对子类公开但不对其他类公开(2)子类从它的父类中继承的成员有方法、域、属性、索引指示器,但对于构造方法有一些特殊,它不能被继承,只能被调用。对于调用父类的成员,可以用base关键字。(3)除了构造函数和析构函数,子类可以继承父类的一切。(4)子类对象可以赋值给父类,即子类可以代替父类出现,相反就不行了。子类以父类身份出现时,工作时子类是以自己的方式实现的,子类特有的属性和方法不可使用。 

六、多态

      多态表示不同的对象可以执行相同的动作,但要通过它们自己实现代码来执行。为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的,这是通过在该成员的返回类型之前添加virtual关键字来实现的。通常虚拟的是方法,但其实除了字段不能是虚拟的,属性、事件和索引器都可以是虚拟的。尽管方法可以是虚拟的,但虚方法还是有方法体,可以实际做些事情,然后子类可以选择使用override关键字,将父类实现替换为它自己的实现,这就是方法重写(override)。

      多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用,即虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的

七、抽象类

      抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是来继承的,所以在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类。C#允许把类和方法声明为abstruct,即抽象类和抽象方法。把实例化没有任何意义的父类改成抽象类。

注意(1)抽象类不能实例化(2)抽象方法是必须被子类重写的方法(3)如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。(4)抽象类拥有尽可能多的共同代码,拥有尽可能少的数据。

八、接口

      接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所指定的所有属性和成员。声明接口在语法上与声明类完全相同,但不允许提供接口中任何成员的执行方式。所以接口不能实例化,不能有构造方法和字段;不能有修饰符,不能声明虚拟的或者静态的。注意(1)一个类可以支持多个接口,多个类也可以支持相同的接口(2)实现接口的类必须要实现接口中的所有方法和属性。(3)接口用interface声明,而不是class,接口名称前要加‘I’,接口中的方法或属性前面不能有修饰符、方法没有方法体。

抽象类和接口的区别

      从表象来说,抽象类可以给出一些成员的实现,接口却不能包含成员的实现;抽象类的抽象成员可以被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但可以实现多个接口。另外有三点区分:(1)类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象(2)如果行为跨越不同的类的对象,可使用接口,对于一些相似的类对象,用继承抽象类,实现接口和继承抽象类并不冲突。(3)从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知子类的存在,方法如何实现还不确认,预先定义。

以上就是对面向对象的一些主要的知识点简单的回顾一下,希望通过回顾,能够帮助大家在接下来的设计模式的学习中扫清基础知识的障碍。如果觉得我的总结比较乱的话,建议去读《大话设计模式》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值