【发布时间】:2021-05-06 03:47:08
【问题描述】:
我想我在开始之前就知道了这个问题的答案,但是在 Google 上按照这些思路进行了多次搜索之后,我找不到明确的答案。
这个问题假设我们在 Ecmascript 6 及更高版本中使用类模式。
我最初的信念是方法覆盖
在面向对象的编程中,是一种语言特性,它允许 子类或子类来提供一个特定的实现 已经由其超类或父类之一提供的方法 类。 Wikipedia
另一方面,方法阴影(不仅仅是块范围'变量阴影'-Wikipedia)似乎只在像 C# 这样的强类型语言的上下文中才有意义,它允许您设置一个 ' 的实例子类”作为“基类”类型,这意味着实例恢复为基类方法,而不是任何“阴影”方法。
public abstract class BaseClass
{
public virtual void shadowedMethod()
{
Console.WriteLine("This is the BaseClass version");
}
}
public class DerivedClass : BaseClass
{
public new void shadowedMethod()
{
Console.WriteLine("This is the Derived child class");
}
}
public class Program
{
public static void Main()
{
BaseClass instance = new DerivedClass(); // Because BaseClass type is set instead of DerivedClass
instance.shadowedMethod(); // It prints "This is the BaseClass version"
}
}
Code adapted from this article
所以问题是:为什么大多数 JS 线程和文档ECMA Standard 交替使用覆盖和阴影(但倾向于使用阴影)?我们不应该只用一个词来停止混淆吗?在 Javascript 中,重写和隐藏方法之间实际上存在细微差别吗?
【问题讨论】:
-
ECMAScript 标准仅在 OOP 上下文中使用“覆盖”,而“遮蔽”仅用于范围绑定。它们不能互换使用。
-
啊,我可能需要花更多时间阅读标准。我的陈述更多地基于 Zakas 的“理解 ECMASCRIPT 6”,他说“派生类上的方法总是隐藏基类上的同名方法”
标签: javascript ecmascript-6 overriding terminology shadowing