Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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
Java 为什么在C+中向下转换是一种不好的做法+;而不是用另一种语言? 我曾经问过一个关于如何设计一个C++代码的问题(这里可以找到),人们告诉我,向下浇铸被认为是一个很糟糕的练习,除了非常具体的场景。_Java_C#_C++_Downcast - Fatal编程技术网

Java 为什么在C+中向下转换是一种不好的做法+;而不是用另一种语言? 我曾经问过一个关于如何设计一个C++代码的问题(这里可以找到),人们告诉我,向下浇铸被认为是一个很糟糕的练习,除了非常具体的场景。

Java 为什么在C+中向下转换是一种不好的做法+;而不是用另一种语言? 我曾经问过一个关于如何设计一个C++代码的问题(这里可以找到),人们告诉我,向下浇铸被认为是一个很糟糕的练习,除了非常具体的场景。,java,c#,c++,downcast,Java,C#,C++,Downcast,然而,我在C#和Java中看到了许多代码,它们似乎是一种完全自然的做事方式。例如,在Android SDK中,有一个函数返回一个视图,然后向下转换为其实际类: TextView tv = (TextView) this.findViewById( R.id.myTextView ); 为什么在C++中不需要这样做,而不是用其他语言? 我知道C++和java都支持内省,而不是C++,它需要一种类型字段,但最终是相同的,不是吗?< /P> < P>在其他解释语言中,类型检查是在JVM等解释程序中完

然而,我在C#和Java中看到了许多代码,它们似乎是一种完全自然的做事方式。例如,在Android SDK中,有一个函数返回一个视图,然后向下转换为其实际类:

TextView tv = (TextView) this.findViewById( R.id.myTextView );
为什么在C++中不需要这样做,而不是用其他语言?
我知道C++和java都支持内省,而不是C++,它需要一种类型字段,但最终是相同的,不是吗?< /P> < P>在其他解释语言中,类型检查是在JVM等解释程序中完成的。在C++中,您必须手动进行类型检查。 在其他解释器语言中,类型检查是在JVM等解释器中完成的。在C++中,您必须手动进行类型检查。 至少有两个非常不同的原因,所有这些都很重要:

  • 概念性:其他语言(特别是Java,但在很大程度上也是C#和强烈鼓励使用“引用类型”的类似语言)使用运行时多态性作为单一工具来解决许多不同的问题(编译时多态性、代码重用、性能增强、类型删除、运行时多态性等),而C++对个别问题有不同的、更专业的和更合适的解决方案。(模板、值类型等可以用来解决个别问题)。因此,C++中的多态性在其他语言中的应用较少,在常见的情况下,使用(或不)使用下拉字符或<代码> < < />代码>通常是(但不总是)不恰当的。

  • <> >强>语用“强”:C++中的向下流派操作符与其他操作符的性能相比,在本质上是非常缓慢的,主要原因是C++允许多继承和虚继承。其他语言不这样,所以它们的转换更简单。此外,某些编译器的实现本身也有。历史上有更慢的实现下拉(例如,我相信64位Visual C++是其中之一)。因此,开发人员试图避免它的实际性能特征,除了概念上的原因(1)之外。


    由于这些原因,除非你绝对需要,否则在C++中使用<代码>动态DistaCase<代码>是不好的。

    < P>至少有两个非常不同的原因,它们都是重要的:

  • 概念性:其他语言(特别是Java,但在很大程度上也是C#和强烈鼓励使用“引用类型”的类似语言)使用运行时多态性作为单一工具来解决许多不同的问题(编译时多态性、代码重用、性能增强、类型删除、运行时多态性等),而C++对个别问题有不同的、更专业的和更合适的解决方案。(模板、值类型等可以用来解决个别问题)。因此,C++中的多态性在其他语言中的应用较少,在常见的情况下,使用(或不)使用下拉字符或<代码> < < />代码>通常是(但不总是)不恰当的。

  • <> >强>语用“强”:C++中的向下流派操作符与其他操作符的性能相比,在本质上是非常缓慢的,主要原因是C++允许多继承和虚继承。其他语言不这样,所以它们的转换更简单。此外,某些编译器的实现本身也有。历史上有更慢的实现下拉(例如,我相信64位Visual C++是其中之一)。因此,开发人员试图避免它的实际性能特征,除了概念上的原因(1)之外。


    由于这些原因,除非你绝对需要,否则在C++中使用<代码>动态DistaCase<代码>是不好的。

    < P>在C++中使用相同的成语,其中API处理程序,并通过<代码>空白> >代码>或>代码>长>代码>将其存储到API对象的实例中。在WINAPI,<代码> RegisterClass < /C>前者的典型例子,后者是代码> SET/GETWOLDOWPRPTR <代码>。这些是您提到的“非常具体的场景”,它适用于托管语言和C++两者。


    一般来说,静态类型的语言回避向下编译,因为它将类型检查从编译运行到运行时间。

    < P>在C++中使用相同的成语,其中API处理程序,并将<代码>空白> /COD>或<代码>长<代码>,或者用API对象的实例存储这样的变量。在WINAPI,<代码> RegisterClass < /C> >是一个类型。前者的CAL示例,后者的代码> SET/GETWOLDOWPRPTR <代码>。这些是您提到的“非常具体的场景”,它适用于托管语言和C++两者。


    一般来说,静态类型语言避免向下转换,因为它将类型检查从编译时转移到运行时。

    为什么一些随机仇恨者想要结束这个完全合法的问题?是什么让你认为在其他语言中向下转换是好的?这个问题似乎是从一个不受支持的前提开始的。@chi:我知道OP在哪里了NG从我的确有人警告C++中的向下压缩,但是在其他语言中很少有。@我假设Android的人不是初学者,知道什么是好的或坏的实践,并且从他们设计的API的方式推断出它是java中的合法。@ ViuS721你怎么能说下去?在java中,铸造不是床上练习吗?如果你说的是正确的,那么