面向对象编程除了方法还有什么?

5

我对面向对象编程的理解非常有限。

我已经在.Net上编程一年左右了,但是我完全是自学的,所以一些更高级的OOP用法对我来说并不清晰。

封装、继承、抽象等,我知道它们的意思(表面上),但是它们的用途是什么呢?

我只是将可重复使用的代码放入方法中使用OOP,但我知道我错过了很多功能。

即使是类 - 我只制作了两三个实际的类。相反,我通常只是将所有方法包含在主窗体中。


8
根据您的描述,您实际上并没有进行几乎任何面向对象编程。当所有内容都在同一个对象(MainForm)中时,将可重用的代码放入方法中只是普通的过程式编程。 - Tyler McHenry
3
“只是普通的过程式编程”,用类修饰打扮一下。 - S.Lott
1
以下其他问题可能会帮助您入门:http://stackoverflow.com/questions/2235986/how-can-i-think-in-oop https://dev59.com/0HE85IYBdhLWcg3wnU6p https://dev59.com/m3VC5IYBdhLWcg3wcgqd - Jeff
1
相关主题:https://dev59.com/HHVD5IYBdhLWcg3wTZxm,https://dev59.com/fHNA5IYBdhLWcg3wWseK - Péter Török
不确定这里的标准是在我的帖子上发表评论还是回答,但感谢大家快速、丰富的答案。我会开始逐个查看你们给我的链接。谢谢! - John
2
@John。标准是注释,你做得很对;-) - Federico klez Culloca
6个回答

4
OOP太过复杂,无法在StackOverflow答案中进行解释,但主要思路如下:
面向过程编程是关于编写对数据执行操作的代码。而面向对象编程则是创建能够自行执行操作的数据。
在面向过程编程中,你有函数和数据。数据有结构但被动,你编写函数来对数据和资源执行操作。
在面向对象编程中,数据和资源由具有属性和方法的对象表示。这里,数据不再是被动的:方法是指示数据或资源在自身上执行某些操作的手段。
区别之所以重要,是因为在面向过程编程中,任何部分都可以检查或修改任意方式的数据。你必须小心不同函数之间触及相同数据时出现的意外交互,并且如果选择更改数据的存储或组织方式,则必须修改大量代码。
但在面向对象编程中,如果封装使用得当,则除了对象内部的代码外,没有其他代码需要知道(因此不会依赖于)数据对象如何存储其属性或变异自身。这有助于极大地模块化您的代码,因为每个对象现在都有一个明确定义的接口,只要它继续支持该接口,并且其他对象和自由函数通过该接口使用它,那么内部工作就可以被修改而没有风险。
此外,对象的概念以及继承和组合的使用,允许您在代码中结构化地建模数据。如果需要表示员工的数据,就创建一个名为Employee的类;如果需要使用打印机资源,则创建一个Printer类;如果需要在对话框上绘制按钮,则创建一个Button类。这种方式不仅使你实现了更大规模的模块化,而且你的模块反映了程序应该处理的任何真实事物的有用模型。

2

哎呀,现在我们必须对S.Lott进行踩票并将其标记为垃圾邮件,除非他在那里放置一个关于这是“他的”书的大免责声明! - Jon B
1
看起来不错。面向对象的设计而不是面向对象的编程,我喜欢它。我认为编程中的设计方面缺乏良好的处理方式,可能是因为它是非确定性的——对于某些东西,没有可证明的正确设计。 - Paul D. Waite
4
@Jon B: 买东西?!?!糟糕。[捂脸!] 我一直错过了可以把这变成垃圾邮件的收入流。 - S.Lott
4
好的,你应该在答案中提到这是你的书。 - Georg Schölly
2
天啊,伙计们 - 我只是在逗 S.Lott 开玩笑。你们不必真的将其标记为垃圾邮件! - Jon B
显示剩余5条评论

2

0

0
保持简洁:不要在许多不同的地方对数据进行操作,而是要求对象执行其任务,而不关心它如何执行。
多态性:不同的对象可以做不同的事情,但给它们相同的名称,这样你就可以通过请求该类型的任何对象来执行该命名操作,从而要求该特定超类型的任何对象执行其任务。

0

我学习了Turbo Pascal中的OOP,发现当我尝试建模物理对象时它立即变得有用。典型的例子包括一个Circle对象,它有位置和半径字段以及绘制、检查点是否在内部或外部和其他操作的方法。我想,你开始把类看作是对象,把方法看作是动词和行动。过程式编程就像写脚本一样。它通常是线性的,并且按照需要完成的步骤进行。在OOP世界中,您构建了一个可用的动作和任务库(就像乐高积木),并使用它们来做您想做的事情。

继承用于多个对象应该/可以使用共同的代码。您可以轻松地反向操作,并为所需内容创建过多的类。如果我正在处理形状,我真的需要两个不同的矩形和正方形类吗,还是可以使用具有不同值(字段)的公共类。

精通需要经验和实践。一旦您开始思考如何解决特定问题(特别是当涉及到将来再次使用您的代码时),慢慢地您将获得信心,开始在您的代码中包含越来越多的OOP功能。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接