我有一个朋友有兴趣参与编程,并且询问了很多不同的概念。类,接口和诸如多态/继承之类的东西很容易解释,但我在类比反思方面有点挣扎。
你如何解释它是什么以及它在实践中如何运作?
答案 0 :(得分:19)
反射只是一个对象能够告诉你自己,它的方法,实例变量,类型等的能力。要使用这个隐喻,它就像在镜子里看到自己一样命名。通过这种方式,您可以向其他人描述自己。同样,反射是对象(甚至程序)描述自身的能力。
答案 1 :(得分:3)
“在大多数编程中,数据和操作是两个独立的事情(操作处理数据)。通过反射,操作变为数据,允许程序了解甚至修改自己。”
虽然这可能过于简单了?
编辑:此外,如果你想要一个类比,名称反射提供了一个很好的。反思就像程序可以在镜子中看到自己。所以它可以调用方法,只知道它们的名字作为字符串,并获得字符串中的方法名称列表等。
答案 2 :(得分:3)
我不会。反射是一种编程概念,它只与程序员有关。如果您不是程序员,那么您不需要或想要了解它,而不仅仅是我需要了解构建核反应堆的技术实施细节。
由于此人有兴趣学习编程无论如何,我真的没有看到问题。帮助他学习编程,迟早他会有讨论反思所需的词汇,然后你可以告诉他如果他需要它是什么。
答案 3 :(得分:1)
在解释反思之前,解释静态类型语言与动态类型之间的区别是个好主意。然而,向非程序员解释对反射的需求将是一个挑战。如果他们提出足够的问题,你将不可避免地要解释使用反思的缺点......
答案 4 :(得分:1)
想象一个班级是一辆汽车。它有一些属性,如:
它也有一些方法:
想象一下,你得到一些新车(最新和最好的),你什么都不知道。没有人告诉你任何事情。所以你转向反射。机械。他会看一下引擎盖并告诉你它有什么样的引擎。您还可以使用哪些其他属性以及调用方法...
最后你将能驾驶这款新车,因为你知道它有什么属性/方法。
答案 5 :(得分:0)
如果您的朋友知道像Python这样的动态语言,那么解释如何实现反射可能会有所帮助;即对象只是字典,并且该反射允许您以字典形式查看对象,而不是通常处理对象。
答案 6 :(得分:0)
镜像类比是不完美的,因为它意味着反射是物体对自身的作用。任何对象或函数都可以反映在另一个对象上。此外,在一些实现中,存在用于反射的单独的类或函数;你不要调用方法或访问abject的属性来反映它。
竞争的比喻是意识。有意识的实体可以检查现实世界中的对象并描述其属性,这是程序化反射的全部内容。这个类比的问题在于,意识意味着实体方面的认知意识,而反思则不然。只要你提出这个警告,就不会产生误导。
而不是(误导)类比,一些说明用途怎么样?反射是实现调试器的一个中心任务的简单方法:检查存储在变量中的对象。通过反射可以更轻松地从外部数据存储中存储和检索对象,因为您不必为每个类编写序列化程序。通用序列化程序可以使用反射来检查对象的属性,并使用它来创建数据库模式。