学友来函:从面向过程到面向对象的思考

 学友郑*:

我本来学过一点C语言,不过没学深,后悔了。水平很菜,处于面向过程没学好,面向对象又不懂的阶段。我所理解的软件编程,就是用函数拼凑的。以前用VB6.0的时候,只知道双击Button按钮,里面捣鼓点代码进去。现在学.net。面对这么一个末知王国,有点晕。真不知道门在哪里?学了金老师的《.NET 编程语言与面向对象理论基础》继承,接口,多态。有点通了。光记概念很枯燥,学不会。想把哪个“七天”的程序用面向对象的方法写。
现在我用类来重新封装。简单说一下方法:我用一个抽象基类Shape()来抽象所有的图形。抽象基类Shape中定义一个DrawPicture()的抽象方法。其他圆Circle()线段Line()扇形Sector()多边形Polygon()都继承于Shape()类,实现DrawPicture()方法。原来的参数控制类不变DrawArgu(),New对象类的时候可以把DrawArgu()类作为参数传过去。
具体代码贴不下,在我的博客里
http://blog.csdn.net/iceberg2008/archive/2008/12/11/3500596.aspx
这个程序让我思考如下:
1、多态真的不错, sp.DrawPicture()方法在不同的对象中有不同的做法。
2、以后程序扩展只要编写不同的图形类就可以了。而且各个类互不干扰。
3、图形类都继承基类的DrawPicture()方法,使得对外部都可以用
Shape sp=new 图形类(DrawArgu argu);
sp.DrawPicture()
来画具体不同的图形。所以修改起来也很方便,外部几乎不用改,只要修改类里的DrawPicture()方法就行了。
4、图形类不用全部实例化,只要根据基类的DrawShope字段来判断,需要哪个New哪个就行了。
我原来想吧,参数控件类DrawArgu类,并到基类中,可是基类是抽象类,抽象类是不能实例化的,所以基类只有一个抽象方法。
这只是我一点不成熟的想法,还请老师提出意见,对于“七天”的这个绘图程序,怎样用面向对象的方法做好?我这个程序肯定有很多不对的地方,请老师指正!

————————————————————————————————————

回复老师:金旭亮


多态的应用要适可而止。因为多态代码的可读性不太强。一般情况下,只有的确需要动态扩展的部分使用多态,而不太可能变化和扩展的地方还是用最简单最直接的方法实现就行了。面向对象分析与设计理论及软件工程中都有专家指出过“滥用多态”所存在的一些弊端。
对于“七天学会绘图”这个示例,由于是设计来作为教学用的,实在没必要引入多态以增加软件的复杂性。除非你打算开发一个矢量绘图程序,那么,设计一个合理的图形对象继承体系就非常关键了。然而,在.NET下,使用GDI+开发矢量绘图程序又不是必要的了,WPF更适合,WPF拥有一个精心设计的图形类继承体系,你可以看一下,它是如何设计的。如果你想了解多态的应用,在.NET中太多了,随便在MSDN中找一个接口(比如IComparable<>接口),再看看实现这一接口的类,找一些示例代码,你就发现多态的妙用。
.NET Framework本身的设计就有许多可圈可点之处,毕竟是一群全世界一流的人集体开发出来的,是学习的好材料。
另外,要注意各种技术都有最适宜的应用场景,避免用一种你最喜欢的技术去“包打天下”。比如,过去曾有C++的Fans要用C++开发他所遇到的所有程序,津津乐道于C++的强大与灵活,其实,这未免走向了另一个极端。
总之,这种积极探索的精神非常好,许多优秀的软件工程师在他们初始学习技术的阶段其表现都是类似的,呵呵,这些年来我见过一些,这些学生都在日后的工作中表现不错,相信发展也会很好。
呵呵,继续努力啊!

————————————————————————————————————————

乐知学堂.NET专家培练营详情请见xuetang.itcast.net/

 

你可能感兴趣的:(编程,C++,c,.net,WPF)