oop - OOP 与面向类的编程
问题描述
有人可以客观地告诉我面向对象和面向类/基于类的编程有什么区别吗?我知道一点 OOP 基础知识,但我对面向类的范式一无所知。一个启发性的例子将是非常受欢迎的(它不必是一些代码——一个简短的解释就足够了)。谢谢。
解决方案
基于类的编程精确地描述了大多数常用语言支持的面向对象编程的常见形式:对象行为是根据对象作为实例的类来定义的。
这是一个面向类的编程示例(在 Python 中):
class Foo:
def __init__(self, x, y):
self.one = x
self.two = y
class Bar(Foo):
def __init__(self, z, **kwargs):
super().__init__(**kwargs)
self.three = z
bar = Bar(1,2,3)
assert bar.one == 1
assert bar.two == 2
assert bar.three == 3
bar
“继承”它对属性的支持one
以及two
从子类Foo
的Bar
类。
(是的,这正是您听到“面向对象编程”时所想到的。)
相反,基于原型的编程将省去类,而只是根据另一个对象来定义一个对象。这是取自https://en.wikipedia.org/wiki/Prototype-based_programming的一个简短示例,用 JavaScript 编写。(这也是前面基于类的示例所基于的。)
var foo = {one: 1, two: 2};
var bar = Object.create(foo);
bar.three = 3;
bar.one; // 1
bar.two; // 2
bar.three; // 3
我们没有定义两个类,其中一个继承自另一个并用于定义 使用的属性,而是定义了一个将继承自bar
的“通用”对象。我们通过使用作为“原型”来创建;除了我们为 明确定义的内容之外,它还将拥有它所继承的内容。foo
bar
bar
foo
bar
foo
推荐阅读
- javascript - 用 matter.js 和/或 phaser.js 绘制闭合不规则多边形的正确语法是什么?
- java - Poller 在从 SQS 读取时是否应该抛出或处理异常?
- cuda - 使用 cuda Thrust 进行多次出现的子向量搜索
- asciidoc - Spring REST Docs:非英文字符串在自定义片段表列中不起作用
- java - 如何修复 ExoPlayer 视频冻结 2.9.6
- python-3.x - 由于类型错误,模型无法预测,将模型应用于 UTF-8 编码的 URDU 数据集
- javascript - 如何在我的代码的页面加载时自动单击按钮
- javascript - 从地址获取纬度和经度无法正常工作
- php - 如何为表格中的多个按钮设置 AJAX 调用
- xamarin - 如何在没有 POS 热敏打印机的情况下测试打印机代码?