漫谈:初遇面向对象

首先介绍一下,我是信息工程学院出来的,专业主攻硬件方向,什么模电数电、信号系统和单片机原理这样的,接触到编程门槛的是C语言的学习。上.NET的第一堂课就有说到,面向过程和面向对象语言的区别和优劣势,当时只是当做科普听听就是。然后经过一个星期的和C一模一样的语法基础,到了面向对象的相遇。
  
 老实说,以前也有看过C#的,但是每次都是到了面向对象我就嗝屁了,实在不明白类、对象什么的到底在指示什么,为什么会有这样的封装,C语言像植入我脑中一样,方法的封装的效果不是一样么。C#的调用对象下的字段和方法什么,不就是C语言中的局部变量和全局变量的运用和函数的调用么,就算C#中的不同命名空间,那不也是在C中的不同文件下代码而已。事实呢,真的这样吗?不得不说,面向过程之C语言是很适合入门编程的,没有其它修饰,变量的使用、函数的调用就像是我们需要用的时候,预先写好,使用时需要什么值或者什么参数就直接赋值和传递值,没有独立对象的封装,变量和函数并是属于什么对象的,它们就在本程序中,你要用,就用呗,够直接、坦白的。当然,在高级语言中,面向对象思想会立马提上议程,为什么?只因我接触的世界尚不够清晰,只能讲到:项目的体系过大,若用面向过程去做,天,虽然变量和函数可以分文件区分子项目等,但是,在我们分文件编程和使用的时候恰恰不就是封装成一个个独立的、拥有自己的属性(变量)和行为(函数)的、在主程序使用的时候在适当时机进行调用而使用相关部分功能的文件,而这一种行为不就是原始的封装一类事物的思想么。不过,面向对象的演变我也只能谈到这里,不甚了解啊,至少在项目的体系越发庞大的情况下封装的使用时必须的。
   
回归一下,初遇面向对象时老师举了例子——我去电脑城买电脑。咋一看有点扯,我去电脑城买电脑就买电脑呗,不过这样想就直接暴露面向过程的根深蒂固,事件的进行一步一步按部就班确实不错,但是在加上“我要去电脑城买电脑,但是我不懂电脑,找来了一个行家让他帮我买电脑回来”,这里,事件的进行就分成了两个阶段,我——行家,但是事件的最终完成效果没有差别,而此时,行家,就是封装了的会买电脑的对象。暂停一下,这里如果是我直接去买电脑,产生的过程就是:我、去电脑城、挑品牌、挑电脑、砍价、交易、买了电脑,这样事件才会执行完毕,这就是面向过程,主程序的就需要实现这么一些行为。行家,就是这些事件的封装,而且要求封装得属性和行为必须实现某单一功能而不能加入其它什么多余的东西,所以这样当我要执行买电脑事件的时候,我就不用逐一步骤过程化,而是只关心行家的执行,即现在面向行家,这个行家就是一个对象,按照要求封装的一类事物(这叫行家这哥们不好意思了),这时我们就打开了面向对象的窗。
   
说那么多依然是想其当然,对象什么的就是那么一回事——一个个严格封装了的变量,可是到了C#,就不能归结为函数和变量了,对象的存在就需要我们用一种混淆变量和函数的东西来形容。这时,类的出现水到渠成,而且这个字的意义不就是分门别类的类么,我们为什么要封装、为什么要封装的内容只能这样而不能那样。类,就是要求你在引用的时候要你知道我为了什么引用我,引用类的时候去做什么,这两个什么就规定了这个类的内容。当然,现在的我处在把类当做一种数据类型,里面封装特殊用途的字段和方法,的这一阶段,类在什么时候需要封装,什么样的字段和什么样的方法是不属于这里而又有什么样的字段和方法是属于这里。“当你经历了水深火热的代码折磨后你就知道了”,这是老师所说,确实我也处在这种水深火热中,哈!
   
说完了第一次和面向对象碰面后当然就是和她交往的过程了。对象(不是那对象-.-),在经过一大段的念经书一般的啰里啰嗦得到的就是这一句:Console.WriteLine();
,天,这是要砍人的节奏么,那不就是类似C语言中printf语句么……当然不是。这里不得不说在C#的学习过程中我神往的一句话——万物皆对象。其实大家在刚开始接触C#的时候,如果是从C此等面向过程语言有过基础,就会发现,我们在用语句的时候Console.开头的很多,在为变量调用什么方法的时候往往也是后面加.的,(我就认为.Net已经学一半了,学会.了。额,有点冷的赶脚),在有了这些发现,然后在遇到了面向对象的概念后,这些全部都是面向对象。跟随而来的就是,为什么在C#语言了什么都是对象,无论普通int
什么变量名,用什么方法如Math.Ceiling,连个转换Convert.或者Parse()都是,就算是你打印一行话,在你直接使用变量名打印的时候也是在使用变量这个对象里的方法ToString()方法。尤其在认识到C#里的所有类都继承于object这个类的时候,瞬间有点觉得C#有高大上的赶脚,彻彻底底的面向对象编程,无论你在使用C#做什么操作,声明什么,封装什么,你都在使用OOP,处处留心,虽然这些封装了的“中介”可能一时半会接受不完,微软编辑了这么牛和这么多的类,我们以后进行编程的时候也在处处封装各种各样的类进行OOP,什么时候进行封装类、怎么样进行封装、封装什么属性和行为,类之间的关系和在实现功能时严谨遵循单一功能原则进行归属类的行为。尽然接口有污染一词形容,那么我觉得污染也可以用在类中,避免类的属性和行为——主要是行为,因为属性最终要为行为服务的——的污染,即避免功能混淆,谨记单一功能,记得我们为了什么而封装这个类。

一位C#菜鸟在接触面向对象后不得不说的一些话。

2014-06-01 20:46:34

时间: 2024-08-30 13:33:27

漫谈:初遇面向对象的相关文章

JAVA 蔡羽 基础知识漫谈

基础知识漫谈(1): 想到哪儿写到哪儿 http://www.cnblogs.com/anrainie/p/5606570.html 基础知识漫谈(2):从设计UI框架开始 http://www.cnblogs.com/anrainie/p/5609958.html 基础知识漫谈(3) 组合基础知识,设计游戏框架 http://www.cnblogs.com/anrainie/p/5614461.html 基础知识漫谈(4):讲讲元数据 http://www.cnblogs.com/anrain

漫谈程序员系列:一个老程序员的2014年终总结

人生天地之间,若白驹过隙,忽然而已.蓦然回首,头上似霜雪,脸上似山川.我的 2014 啊,你就这么毫无眷恋地离我而去了.既然往事已不可追,未来尚未到来,在这年末岁首的间隙,就让我来回忆一下余烟尚存的 2014 吧. 2014 年,对我而言,发生了很多事,不管怎样,我还是一个程序员,这是工作.生活,以及我自己,给我的标签.也许很快这个标签会泛黄.蝶化.零落成泥碾作尘,不过不论怎样,它是我青春的纪念,它仍将伴随着我继续前行. 坚持技术博客写作 看到这里,也许你笑了. 是啊,这一年我不务正业,虽然每周

让技术人员看得懂的面向对象设计流程

1.概述 谈到流程,大家都会想到熟悉的瀑布模型.螺旋模型.迭代开发.敏捷.RUP等一堆软件工程相关的软件开发流程,但是请不要误会,本文的流程和这些管理流程完全不同,为了以示区分,我把瀑布模型.敏捷.RUP等流程成为项目流程,也就是说这是给项目管理用的:而本文的流程是技术流程,是给技术人员(主要是设计人员)看的流程. 在开始讲解之前,看看如下问题你是否能够回答? 1.客户的需求是描述性的,例如"我们需要一个POS机",而代码是一个一个具体的类和函数,那么如何从描述性的语言最后转化到具体的

PHP设计模式漫谈之迭代器模式

原文出处:blogspot 今天<PHP设计模式漫谈>系列的主角是迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代.迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代. 在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(facet),Client类往往分离自真实对象实现,指iterator接口.只要有可能,我们可以给迭代器传送一个引用,代替将来可能发生变化的具体或

漫谈 JVM —— 内存

JVM 是什么呢?说的直白点就是 Java 代码运行的地方,全称 Java Virtural Machine,Java 虚拟机.有的人就会奇怪了,为什么 Java 程序员需要了解这个东西?毕竟大多数情况下,"能跑"就行. 能跑真的行吗?你说在一个小公司里,"能跑"就行那是肯定的,业务必定是优先的.可是发展到规模大了之后,"能跑"好像就没那么简单了.规模大了,程序突然崩溃了,却不知道什么情况,这可以叫"能跑"吗?好像不是这样.所

python学习 面向对象封装

from collectoins import namedtuplePoint=namedtuple('point',['x','y'])t1=Point(1,2)print(t1.x)print(t1.y)没有方法的类属性不会发生变化    定义简单 不能改变面向对象封装私有属性!!!私有方法!!!用装饰器描述的几个方法@property !!!@classmethod!!@staticmethod! 封装:class Teacher:     def __init__(self,name,p

python—面向对象的封装

封装 私有属性 class Teacher: __identifier = 'Teacher' #私有静态属性 def __init__(self,name,pwd) self.name = name self.__pwd = pwd #私有属性 内部使用,外部不能使用 def pwd(self): print(self.__pwd) alex = Teacher('alex','3714') alex.pwd() class Teacher: __identifier = 'Teacher'

python学习_day26_面向对象之封装

1.私有属性 (1)动态属性 在python中用双下划线开头的方式将属性隐藏起来.类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式.这种自动变形的特点是: a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果.b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的.c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆

python面向对象知识点疏理

面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.class 类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中且在函数体之外.类变量通常不作为实例变量使用. 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据. 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写. 实例变量:定义在方法中的变量,只作用于当前实例的类. 继承:即一个派生类(de