Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 如何解释一个物体?_Language Agnostic_Oop_Object - Fatal编程技术网

Language agnostic 如何解释一个物体?

Language agnostic 如何解释一个物体?,language-agnostic,oop,object,Language Agnostic,Oop,Object,我已经好几年没有想到这个了,但我很快就要训练一些真正的年轻人,需要向不知道什么是物体的人解释什么是物体 根据您在现实世界中使用的内容,我应该重点解释对象的关键点是什么。例如: 访问级别 继承权 封装 多态性 抽象 接口 如果你想要真正有用的东西,别忘了解释原因。这是一个经常被忽略的概念-为什么这很有用…使用现实生活中的例子 动物(界面) 哺乳动物(抽象类) 狗(类) 您的狗(对象实例) 访问级别: 你妈妈不能碰你的私处,但你的朋友可以。我喜欢“车”的例子。很多东西可以是交通工具(抽象类),

我已经好几年没有想到这个了,但我很快就要训练一些真正的年轻人,需要向不知道什么是物体的人解释什么是物体

根据您在现实世界中使用的内容,我应该重点解释对象的关键点是什么。例如:

  • 访问级别
  • 继承权
  • 封装
  • 多态性
  • 抽象
  • 接口

如果你想要真正有用的东西,别忘了解释原因。这是一个经常被忽略的概念-为什么这很有用…

使用现实生活中的例子

  • 动物(界面)
  • 哺乳动物(抽象类)
  • 狗(类)
  • 您的狗(对象实例)
访问级别: 你妈妈不能碰你的私处,但你的朋友可以。

我喜欢“车”的例子。很多东西可以是交通工具(抽象类),但它们都有一个共同点——它们可以以一定的速度从a移动到B。然后可以有不同种类的车辆:水上车辆,一些在水中移动,一些在空中移动

因此,你有另一个抽象层次——例如,空中的所有飞行器都需要一个高度成员


我想你明白了。这就解释了你上面提到的大部分要点。

我更喜欢使用现实生活中你可以与之互动的例子:洗碗机、汽车

这些东西也恰好有一个非常严格的接口:一辆汽车(在欧洲:)有一个加速踏板、一个刹车和一个离合器。你可以询问它的当前速度

封装:如果您知道接口,就不需要知道引擎是如何工作的。一件好事是你不必自己修理引擎

多态性:您可以使用相同的接口驱动Lada和Porche。这意味着您是一个多形驱动程序:)


注意:我花了很多年的时间来区分接口和继承的概念。我想说:暂时不考虑继承:大多数情况下,代码重用是通过组合实现的(尽管这是一个完全不同的讨论)。

我喜欢艾伦·凯(Alan Kay)最初使用的隐喻,他创造了“面向对象编程”:对象就像身体中的细胞。他们每个人都用自己的行为进行编程,并通过相互传递消息进行通信,然后他们再次用自己内部定义的行为进行响应。没有一个细胞知道另一个细胞的内部是什么——它们只知道如何处理自己的任务和相互交流。

当我学习OOP时,我对所有这些“汽车/动物/任何东西”的隐喻感到困惑。他们根本没有帮助我。然后有人说类/对象只是一组变量(类成员)和处理它们的函数(方法)——这实际上是真的。就这么简单


使用所有这些流行的隐喻只是误导人们,伊姆霍。汽车与OOP没有太多共同之处。当你已经知道这些隐喻的含义时,很容易理解它们,但是试着从它们开始。。。不会。

一如既往,这确实取决于他们来自的语言背景。并不是每种语言都以相同的方式实现OO范式,有时在一种完全不是严格OO的语言中使用OO方法是可能的

一般来说,访问级别很重要。为什么财产通常应该是私有的?有能手和二传手有什么意义?这是一个比较对象与集合(如贴图或数组)的好地方(即使它们可以作为对象而不是原语实现)

遗传和多态性应该齐头并进。不过,这是一个抽象的问题。解释抽象基类和接口之间的区别可能更像是一个语言问题——有些语言允许多重继承,有些语言只允许多重接口

如果对访问级别进行了分类,那么封装是非常简单的。同样,根据您可能想要解释内部类的语言,可能会使用匿名类进一步抽象OO思想

我发现最有效的方法是从熟悉的东西开始:相关函数和变量。学习对象应该是什么以及属性或方法应该属于什么对象是很困难的,所以从清晰的案例开始

数据库处理程序可以是一个很好的例子,也可以是一封电子邮件(创建一封新的电子邮件,设置其标题和内容,附加文件并发送——即使对于非程序员来说也非常简单和熟悉,但它是一个从对象(电子邮件、联系人;甚至邮箱、服务器)、方法(创建、发送、附加、设置)方面思考的完美例子)和属性(标题、内容、附件))


重要的是:即使你的学生有一些(非OO)编程背景,适应OOP也是一个过程,但“得到它”通常不是。我听到很多人把它描述为一个突然的事件,而不是平稳的过渡。当然,“校准”是一个长期的过程:你需要弄清楚什么时候创建新类是有意义的,什么时候几个临时变量、数组或实用函数(取决于你的语言)就足够了,但这需要实践,而不是教学。

我会从访问级别和封装中走出来。封装是一个相当简单的概念,它有一些明显的好处。从这里你可以很容易地谈论抽象、继承和多态性


作为一名大学生,我发现封装在一个相当抽象的领域中是一个很好的锚定概念。

我将遵循Grady Booch的定义:对象是一个具有状态、行为和身份的对象。成员变量对国家有贡献;方法有助于行为和某些行为 独特的属性有助于识别。例如,电子邮件可能是一种
Person对象的标识属性。

我更喜欢“Object-O”中使用的方法
void printContactInfo(String name, String address, String phoneNumber) {
    System.out.println(name + " lives at " + address + " and his/her phone number is + "phoneNumber");
}
Person someguy = new Person("MatrixFrog", "123 Notareal Street", "555 5555");
someguy.printContactInfo();