问题标签 [method-hiding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
407 浏览

c# - 如何在C#中隐藏基类的私有方法?

我没有找到我的问题的答案,但这似乎很简单。主要的大问题是我在 dll 中购买了一些库和一些硬编码的功能,没有源代码我无法重新编译该 dll。所以这里是学校层面的问题:

我们有 2 类 A 和 B

如果我们调用'new B().Method1()',那么我们有字符串行“A”。我们不能对类 A 做任何事情,但我们可以改变类 B。我们应该得到字符串“B”。

我曾尝试使用“新”修饰符,但如您所知,它没有帮助。答案“也只是覆盖 Method1”不是选项,因为实际代码要大得多。

有什么建议么?

0 投票
1 回答
560 浏览

c++ - 在 C++ 中隐藏实现细节

我想从头文件中定义的接口中隐藏实现特定的细节,以便在进行更新时代码可维护且编译速度更快(尽管我没有后者的统计信息)。

但是,我不能使用 2003 年以后的动态内存或 c++(2017 年 11 月 14 日)。我也不能使用像 boost 这样的库。该应用程序是实时嵌入式的,因此效率很重要。有问题的代码与硬件紧密耦合。

我在这里查看了几篇建议 PIMPL 习语的帖子,但是间接和动态内存似乎禁止这样做。一种选择是预先分配类并设置指针,但这似乎不灵活。

下面是一个在实现文件中仅使用函数和静态变量的过度简化示例;是否存在与封装或编译过程相关的问题?考虑到这些限制,我还能如何实现上述目标?

标题中包含详细信息的示例:

实施细节示例:

0 投票
1 回答
49 浏览

java - docs.oracle.com 上有关覆盖和隐藏方法的文本是否模棱两可?

我正在阅读 docs.oracle.com 网站 ( https://docs.oracle.com/javase/tutorial/java/IandI/override.html ) 上的覆盖和隐藏方法。在“静态方法”标题下,Oracle 请为我们总结一下:

“隐藏静态方法和覆盖实例方法之间的区别具有重要意义:

  • 被调用的重写实例方法的版本是子类中的版本。
  • 被调用的隐藏静态方法的版本取决于它是从超类调用还是从子类调用。”

第一个要点非常清楚。第二个要点似乎也提供了很多信息,但是当我重读它时,我似乎感到困惑。

从我的角度来看,似乎超类和子类中的每个静态方法都是隐藏的,并且通过早期绑定(编译时绑定)选择了适当的方法,而另一个是隐藏的。这是由您从中调用它的变量的引用类型选择的。然而,第二个要点中句子的表述使得编译器似乎将这两种方法视为一个,因为它们具有相同的签名,并且具有版本超级和版本子,而不是必须单独隐藏方法并选择合适的方法.

我的问题是这两个角度中的哪一个是正确的(由于方法签名,两种方法都被隐藏了,或者一种方法有两个版本),我考虑哪一个有关系吗?奖金:我对这个主题的一般想法是否正确?

0 投票
3 回答
783 浏览

c++ - 指向派生类的基类指针不能访问派生类方法

我在学习C++11中的继承,发现如果派生类重新定义了虚函数名但原型不同,则分配了指向派生类的指针的基类指针只能访问基类版本的功能。无法访问派生版本功能。我想知道为什么会这样。

main,

根据我对虚函数表的了解,pe指向 (ie foo) 的派生对象应该有一个指向Dragon的 vtable 的 vpointer 成员。我也知道在派生类中重新定义函数名会隐藏基类中的所有同名函数。所以在 Dragon 的 vtable 中,“describe”的地址应该是带有参数的函数int dummy

但事实证明,pe可以访问Enemy该方法的版本,这应该是隐藏的。并且pe无法访问Dragon该方法的版本,该版本应该在pe的 vtable 中。它的执行就像使用了Enemy' 的 vtable 一样。为什么会发生这种情况?

更新:我想现在我或多或少地了解了它背后的机制。这是我的假设:

由于它是指向 的指针Enemy,因此程序将首先在Enemy' 范围内找到方法名称。如果未找到该名称,编译器将给出错误。如果它不是虚拟的,则调用它。如果是虚拟的,则将方法的偏移量记录在Enemy的 vtable 中。然后程序使用这个偏移量来访问目标对象的 vtable 中的正确方法。

如果该方法被正确覆盖,则目标对象的 vtable 中该偏移量处的函数地址将被更改。否则,它将与Enemy的 vtable 中的函数地址相同,如示例中所示。

由于Dragon's describewith是一个不同的原型,它在它从 Enemy 继承的原始int dummy原型之后添加到Dragon's vtable 中。describe但是int dummy无法访问该版本,Enemy*因为Enemy' 的 vtable 甚至没有那个偏移量。

这个对吗?

0 投票
2 回答
77 浏览

java - Java非泛型方法隐藏具有交集类型的泛型方法

如果三个公共接口定义为:

另一个类 Super 定义为:

为什么 Super 的以下子类会出现编译错误?

我希望上述方法可以简单地隐藏 Super 的方法,但事实并非如此。

JLS (8.4.8.2) 说:

如果类 C 声明或继承静态方法 m,则称 m 隐藏任何方法 m',其中 m 的签名是 m' 签名的子签名(第 8.4.2 节),位于否则可以访问(第 6.6 节)以用 C 编写代码的 C。

其中子签名在 8.4.2 中定义为:

如果两个方法或构造函数 M 和 N 具有相同的名称、相同的类型参数(如果有)(第 8.4.4 节),并且在将 N 的形式参数类型调整为类型参数之后,则它们具有相同的签名的 M,形参类型相同。

方法 m1 的签名是方法 m2 的签名的子签名,如果: m2 与 m1 具有相同的签名,或者 m1 的签名与 m2 签名的擦除(第 4.6 节)相同。

根据 JLS 4.6,类型变量的擦除是其最左边界的擦除,因此:据我了解,Subber 的 hmm 方法与 Super 的 hmm 方法的擦除相同,因此是 Super 的 hmm 的子签名,因此意味着它会隐藏 Super 的嗯。但是,我得到的错误消息(来自 eclipse),鉴于上述情况,这似乎没有意义:“Subber 类型的方法 hmm(One) 与 Super 类型的 hmm(E) 具有相同的擦除,但没有把它藏起来。” 我错过了什么?

编辑:主要方法仅包含的精确错误消息Subber.hmm(null);是:

有人可以引用可靠的来源(最好是 JLS)解释为什么 Subber 的方法无法编译吗?

0 投票
2 回答
385 浏览

java - 具有继承和覆盖/方法隐藏的实例和静态控制流

我在玩弄实例控制流和静态控制流,注意下面的代码

代码的输出是:
Main m1
A constructor

我知道这是因为:
首先,静态块和变量被识别为自上而下的父子,在这种情况下,只有一个main()是静态的。
其次,静态块和变量赋值被执行,所以main()开始执行,并且尝试创建一个新Main对象。
所以第三,将识别父类的实例块和变量。然后它们将自上而下执行。(之后父类的构造函数运行,然后识别子类的实例块和变量,然后自上而下执行,最后执行子类的构造函数)。


所以 A 中的实例块调用了 `m1()`。然后,A 的构造函数执行。最后,控制流返回到 `main()` 并且程序终止。
现在,从 A 调用 `m1()` 调用了 `Main` 的 `m1()`。但是,如果我将“m1()”方法都设为静态,其他一切都保持不变,那么从 A 的实例块调用“m1()”就会调用 A 的“m1()”。

我有两个问题(为什么?纯粹出于学术原因,我还在学习 Java):

  1. 当这两种m1()方法都是非静态的时,是否可以从 A 的实例块调用 A 的 m1()?我尝试做一个this.m1(),但仍然调用 Main 的 m1()。(为什么?)
  2. 当这两个m1()方法都是静态的时,是否可以从 A 的实例块调用 Main 的 m1()?(我猜不是,但我不确定)。

    我知道在第一种情况下,它正在发生,而在第二种情况下,它是方法隐藏。但是我仍然不确定如何根据这些知识回答我的问题。
0 投票
1 回答
40 浏览

c++ - 为什么只调用派生类成员函数?

在下面的代码中:
请告诉我为什么只调用派生类成员函数,是因为hiding?以及为什么没有出现错误b.func(1.1);,参数是int x

0 投票
2 回答
102 浏览

java - 为什么 `java.lang.Integer` 上的实例方法 `hashCode` 会额外跳转到静态类方法以简单地返回自己的整数值?

我只是在探索 hashCode() 方法的不同实现。我打开了 java.lang.Integer 类,找到了 hashCode() 的这个实现:

我的问题是,为什么实现不能这么简单:

需要创建一个额外的静态方法来传递值并返回相同的值吗?我在这里忽略了任何重要的细节吗?

0 投票
2 回答
178 浏览

java - 如何从 Stacktrace 隐藏一个方法,但不隐藏它的异常?

我正面临这种情况,我的方法会引发一些异常。我屏蔽了异常,因此它没有显示到底是什么,但是在堆栈跟踪中也显示了它来自的方法。

代码是这样的:

在堆栈跟踪中,我得到:

我想从堆栈跟踪中删除这个methodForHiding并只留下maskedException

有什么办法可以做到这一点?

0 投票
0 回答
31 浏览

c# - 编译器如何处理隐藏在 c# 中的方法?

我知道在c#中,指向子类对象的父类的引用变量会调用子类对象的重写方法和基类对象的隐藏方法。在运行时,基类引用变量会计算出对象的实际类型,因此它会调用被覆盖的版本。如果引用变量可以检查实际对象,那么为什么在隐藏方法的情况下它调用基类方法?