问题标签 [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 投票
3 回答
691 浏览

c# - 如何在 C# 中隐藏父方法的所有覆盖

我正在扩展一个库类,它有一个我不想从外部调用的公共方法。我知道我可以使用“new”关键字来隐藏它,但问题是它有很多不同的声明。像这样的东西:

现在我可以这样做:

但我想知道是否没有更简单的方法可以将该函数的所有覆盖设为私有。

0 投票
1 回答
1071 浏览

objective-c - 从 GCD dispatch_async 块中调用 super:安全吗?

我有点苦恼。我知道从块中调用 [self methodName] 将导致保留周期。

然而,在这个类中,由于多线程,我不能允许从块以外的任何其他地方访问块正在访问的方法,因为它可能会导致严重的问题。

当前代码:

正是这样做的,它调用[self getmethod]。虽然调度的块可以运行此方法,但我不希望此类之外的任何东西调用此方法。那么,是否可以像这样覆盖这个继承的方法:

然后将块更改为:

我已经尝试过了,它可以在不调用 [self getMethod] 的情况下工作,但是超级会被保留、正确释放等吗?是的,我正在使用 ARC。在一个块内调用 super 会导致任何问题吗?有没有办法让 __weak 改为 super ?

或者,我怎样才能禁止直接调用 [self getMethod] (它是继承的)并且只在内部使用它?我知道 Objective-C 并没有完全实现这一点,但我知道有一些技巧,比如只在实现文件中声明和实现一个方法。

编辑#1:

我尝试过使用 SEL & IMP 和函数指针。问题是 IMP 和函数指针需要一个实例作为参数,这使得孔点静音:

这只是调用继承的方法。尝试将它与 super 一起使用只会产生错误。在这一点上,我将继续并简单地在块内使用 super,并尝试分析它是否会导致任何保留周期。

编辑#2:

根据 newacct 的回答,这就是我最终要做的事情:

我希望这应该避免任何保留周期,尽管我还没有真正分析它。

0 投票
1 回答
5456 浏览

c# - 使用“方法隐藏”在哪些场景下有意义?

可能的重复:
隐藏在 c# 中的方法和一个有效的例子。为什么它在框架中实现。?什么是真实世界的优势。?

我想知道方法隐藏在 c# 中如何有用?如果您深入了解这个概念,您会发现方法隐藏令人困惑,并驱使我们采用意大利面条式代码风格。这有一些原因:

1-如果您在派生类中需要一个新方法,您可以在派生类中定义一个具有新名称的新方法。

2-在使用向上转换时以多态方式使用,将无法实现预期的行为,这可能会造成混淆。

(特别是如果基类和派生类位于不同的库中并且您希望在代码中的某个位置对它们进行多态使用,这种奇怪的行为可能会非常明显和明显)

这样的行为可能会令人困惑,但如果我们在“ Base ”中使用“ virtual ”,在“ Derived ”中使用“ override ” (我的意思是多态用法),则输出为:“I am Derived Class”。这个输出是我认为我们大多数人所期望的。

换句话说,我相信在层次结构中,大多数开发人员期望在派生类中重写方法而不是想要隐藏基类实现的新方法。

我不明白为什么在c#语言中有这么一个没有优势的坏东西?至少我想知道隐藏在 c# 中的方法的最佳用法是什么?

谢谢您的帮助

0 投票
1 回答
1735 浏览

c++ - 防止派生类对基类隐藏非虚函数

考虑到我有 A 和 B 类,这样

作为A类的设计者,有什么方法可以强制派生类B和其他从A派生的类被阻止(出现某种错误)隐藏非虚函数Fun()?

0 投票
2 回答
107 浏览

c# - 隐藏基类中存在的方法

上面的代码没有覆盖方法 ReturnContents()。它在隐藏。所以我期待着声明

this.ReturnContents(safeContents, owner);

存在于 Locksmith 类中(在 OpenSafe() 方法内),如果从对象“JewelThief”引用,将调用 ReturnContents() 方法存在 Jewelthief 对象。

但每次它调用基类方法,ReturnContents。如何解释这种行为?

0 投票
8 回答
88339 浏览

java - Java中隐藏的方法是什么?甚至 JavaDoc 的解释也令人困惑

Javadoc说:

被调用的隐藏方法的版本是超类中的版本,而被调用的覆盖方法的版本是子类中的版本。

没有给我敲钟。任何显示其含义的清晰示例都将受到高度赞赏。

0 投票
3 回答
1437 浏览

c# - 如何实现只能由其封闭类创建的密封公共嵌套类?

目标

我的目标是实现一个密封的、公共的嵌套类,它只能由其封闭类创建——不使用反射。

这意味着嵌套类不能有任何公共或内部构造函数或任何公共或内部静态工厂方法。

之前的工作

几年前的这篇文章似乎是答案。(整个线程有很多关于我想要实现的目标的信息。)

它的工作原理非常简单:它利用嵌套类可以访问其封闭类的静态字段这一事实,以及嵌套类的静态构造函数。

封闭类声明了一个静态Func<NestedClassType, NestedClassCtorArgType>委托,该委托返回嵌套类的一个实例,以便封闭类可以将该委托用作工厂方法。

嵌套类本身有一个静态构造函数,它将封闭类的静态工厂委托初始化为将创建嵌套类实例的委托。

问题

不幸的是,我无法让它工作,因为它写在那个答案中。原因是嵌套类的静态构造函数在封闭类使用工厂方法之前没有被调用,因此存在空引用异常。(如果您查看此问题末尾的示例程序,您会明白我的意思。)

我的解决方法

我已经解决了以下问题:

  1. Initialise()向嵌套类添加了一个不执行任何操作的内部静态方法。
  2. 向封闭类添加了一个静态构造函数,该构造函数调用嵌套类的Initialise()方法。

这很好用,但它会留下一些internal static void Initialise()方法形状的痈。

我的问题

有没有办法避免这种方式?我不禁认为我在上面链接的原始帖子中遗漏了一些东西。我误解了答案吗?

在我调用尝试创建嵌套类实例的代码之前,是否有一种聪明的方法可以强制运行嵌套类的静态构造函数?

这种方法还有其他问题吗?

(我知道我可以为嵌套类编写一个公共接口,然后将其返回。这个问题不是要以这种方式解决它!)

示例代码

这是我的示例代码。尝试运行它,它会打印“Test”。然后尝试注释掉标记的行<--- If you comment this out, things won't work并再次运行它。

0 投票
2 回答
2878 浏览

java - 为什么我得到方法覆盖错误?

这是我的超类:

这是我的子类::

主类:

问题是我无法理解为什么 Javac 在静态方法中给了我覆盖错误。PS plzz 详细说明所有覆盖规则也适用于隐藏。喜欢

新方法定义必须具有相同的方法签名(即方法名称和参数)和相同的返回类型。覆盖方法中的参数是否应该是 final 由子类方法的签名决定,不包含参数的 final 修饰符,只包含它们的类型和顺序。

新的

方法定义不能缩小方法的可访问性,但可以加宽新的方法定义只能指定all或none,或者超类中被覆盖方法的throws子句中指定的异常类(包括其子类)的子集

我的错误是: 运行:

线程“主”java.lang.RuntimeException 中的异常:无法编译的源代码 - javaapplication3 中的 m(int)。子类无法覆盖 javaapplication3 中的 m(int)。超类覆盖的方法是静态的,最终在 javaapplication3.Subclass.m(JavaApplication3.java :18) 在 javaapplication3.min.main(JavaApplication3.java:25) Java 结果:1

我还想问一下,当方法被扩展超类的子类隐藏时,​​是否从类名调用静态成员来解析执行哪个版本的方法如果我创建匿名对象然后调用方法,那么编译器如何确定应该调用哪个版本的方法. 在上面的主类代码中,我输入:new Subclass().n();

即使我没有提供引用变量的类型,编译器如何知道应该调用方法的子类版本

0 投票
4 回答
2594 浏览

c# - 抽象方法和隐藏方法

我试图更好地理解 c# 中的抽象类。

我知道在抽象类中你必须重写抽象方法并且可以重写虚拟方法..

我的问题是:

我可以覆盖非虚拟方法吗?(我知道通常我不能 - 但也许抽象类会有所不同?)还是会像隐藏一样?

另外,正如我在此处阅读的如何强制调用 C# 派生方法(第一个答案)-在我看来,因为非虚拟方法在编译时静态链接并且无法更改-我将无法调用这些方法在派生类中,从来没有?如果是这样 - 隐藏方法有什么意义?

0 投票
8 回答
550 浏览

c# - 为什么不使用方法隐藏时不调用父方法?

考虑这段代码:

在上面的代码中,我们不使用方法隐藏。

当创建学生实例并调用showinfo方法时,我的输出是I am Student我不使用new关键字。

为什么不使用方法隐藏时不调用父方法?