问题标签 [protected]

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 投票
2 回答
264 浏览

c# - 如何将公共抽象类的子类化限制为同一程序集中的类型,从而允许将受保护的成员类型化为内部类型

这个问题类似于c# 内部抽象类,如何在外部隐藏使用,但我的动机不同。这是场景

我从以下内容开始:

上面编译得很好。但后来我决定我应该提取一个基类并尝试编写以下内容:

因此问题是,受保护的成员在程序集外部可见,但属于内部类型,因此无法编译。

手头的问题是我如何(或者我可以?)告诉编译器只有与 PublicBaseClass 相同的程序集中的公共类可以从它继承,因此 _fieldA 不会暴露在程序集之外?

还是有另一种方法来做我想做的事情,拥有一个公共超类和一组公共基类,它们都在同一个程序集中,并在它们的公共(“受保护”)代码中使用该程序集的内部类型?

到目前为止,我唯一的想法是:

但那是丑陋的!

0 投票
2 回答
4397 浏览

c++ - c++中基类中受保护字段的问题

我有一个基类,比如说BassClass,有一些字段,我使它们受到保护,还有一些纯虚函数。然后派生类,DerivedClass比如class DerivedClass : public BassClass. DerivedClass 不应该从 BassClass 继承受保护的字段吗?当我尝试编译 DerivedClass 时,编译器抱怨 DerivedClass 没有任何这些字段,这里有什么问题?谢谢

0 投票
5 回答
10854 浏览

c# - 通过基类变量访问的 C# 受保护成员

这似乎是一个新手问题,但你能解释为什么方法 Der.B() 不能通过基类变量访问受保护的 Foo 吗?这对我来说看起来很奇怪:

谢谢!

0 投票
6 回答
4366 浏览

c# - 通过基类/兄弟类阻止受保护成员访问的真正原因是什么?

我最近发现派生类中的方法只能通过派生类(或其子类之一)的实例访问基类的受保护实例成员:

我设法通过向基类添加一个静态方法来解决这个限制,因为 Base 的方法可以访问 Base.Member,而 MyDerived 可以调用该静态方法。

不过,我仍然不明白这种限制的原因。我见过几个不同的解释,但他们无法解释为什么 MyDerived.Test() 仍然被允许访问 MySuperDerived.Member。

原则性解释:“受保护”意味着它只能由该类及其子类访问。YourDerived可以覆盖 Member(),创建一个只能由 YourDerived 及其子类访问的新方法。MyDerived 不能调用被覆盖的 yd.Member(),因为它不是 YourDerived 的子类,也不能调用 b.Member(),因为 b 实际上可能是 YourDerived 的一个实例。

好的,但是为什么 MyDerived 可以调用 msd.Member()?MySuperDerived 可以覆盖 Member(),并且该覆盖应该只能由 MySuperDerived 及其子类访问,对吧?

直到运行时您才真正知道您是否正在调用被覆盖的成员。而当成员是字段时,无论如何也不能被覆盖,但仍然禁止访问。

务实的解释:其他类可能会添加您的类不知道的不变量,您必须使用它们的公共接口,以便他们可以维护这些不变量。如果 MyDerived 可以直接访问 YourDerived 的受保护成员,它可能会破坏这些不变量。

我同样的反对意见在这里也适用。MyDerived 也不知道 MySuperDerived 可能添加哪些不变量——它可能由不同的作者在不同的程序集中定义——那么为什么 MyDerived 可以直接访问其受保护的成员?

我的印象是,这种编译时限制的存在是一种错误的尝试,试图解决一个实际上只能在运行时解决的问题。但也许我错过了一些东西。有没有人举例说明让 MyDerived 通过 YourDerived 或 Base 类型的变量访问 Base 的受保护成员而导致的问题,但在通过 MyDerived 或 MySuperDerived 类型的变量访问它们时存在?

--

更新:我知道编译器只是遵循语言规范;我想知道的是规范那部分的目的。一个理想的答案是,“如果 MyDerived 可以调用 YourDerived.Member(),就会发生 $NIGHTMARE,但在调用 MySuperDerived.Member() 时不会发生这种情况,因为 $ITSALLGOOD。”

0 投票
3 回答
6186 浏览

actionscript-3 - AS3:覆盖子类中的受保护变量

我这里停电了。我以为我理解了这些原则,但我似乎无法再让它发挥作用了。我想让 DeleteButton 从一般的 Button 类继承。此 DeleteButton 应更改受保护的填充值并具有静态标签。这就是我所拥有的:

现在,我认为继承类中更改的 _paddingX 和 _paddingY 值会冒泡到超类。但他们没有。DeleteButton 仍然使用超类的默认值构造。我不知道该怎么做。我在这里想念什么?

提前致谢。

编辑:

我想我将 AS3 的实现与 PHP 的实现混在一起了。PHP中的这个“等效”示例是完全合法的:

0 投票
3 回答
2773 浏览

c# - C# set accessor 可访问程序集中的所有类型,并仅获取派生类型的评估器。如何?

此属性在没有访问修饰符的类型中(因此internal访问):

允许 SomeType 程序集中的所有类型使用getset访问器。问题:如何将访问限制为set仅从SomeType派生的类型(确实是 SomeType )?

被编译器拒绝,因为protected据说限制性低于internal(假设:与protected交集internal,但不完全包含internal--> 派生类型可以存在于 的范围之外internal)。

可以由程序集中的任何类型访问并且仅由程序集中的派生类型设置的代码是什么?

编辑:查看答案后,我想我需要添加该属性的另一个特征,因为它可能会在解决方案中有所不同:该属性的类型实际上是SomeType. 编辑后的代码是:

如果声明了属性public,则编译器会发出错误(属性类型 SomeType 无法访问属性 Length)。

0 投票
2 回答
686 浏览

java - 我可以在 Java 中公开受保护的成员吗?我想从子类访问它

我是 Java 和 OOP 的新手,

我在A类中使用了一个私有子类(实际上是一个结构)B,一切都很顺利,直到我决定为子类B创建一个父类C。我想公开C类的一些受保护成员。

例如:

我得到

对于默认构造函数,隐式超级构造函数 C() 未定义。必须定义显式构造函数

当然,我可以删除扩展 C,并回到我之前的状态。或者我可以做一个getter/setter。但我认为内部结构是可以接受的,它应该能够扩展其他类是可以理解的。

0 投票
9 回答
1452 浏览

c# - What's the difference between an abstract class, and a class with only protected constructors? (.NET)

What are all the difference between an abstract class, and a class with only protected constructor(s)? They seem to be pretty similar to me, in that you can't instantiate either one.

EDIT:

How would you create an instance in a derived class, with a base class with a protected constructor? For instance:

0 投票
6 回答
836 浏览

java - 帮助理解受保护方法的问题

我正在阅读2005 年 4 月的 Sybex Complete Java 2 Certification Study Guide (ISBN0782144195)。本书适用于希望通过 java 认证的 java 开发人员。

在关于访问修饰符(以及其他修饰符)的一章之后,我发现了以下问题(#17):

对或错:如果类 Y 扩展类 X,两个类在不同的包中,并且类 X 有一个名为 abby() 的受保护方法,那么 Y 的任何实例都可以调用 Y 的任何其他实例的 abby() 方法。

这个问题让我有点困惑。

据我所知,您可以在同一类(或子类)的任何变量上调用受保护的方法。您不能在层次结构中比您更高的变量上调用它(例如,您实现的接口)。

例如,您不能仅仅因为您继承它而克隆任何对象。

但是这些问题没有提到变量类型,只提到了实例类型。

我有点困惑,回答“是”。

书中的答案是

错误的。从不同包中的超类继承受保护方法的对象可以在其自身上调用该方法,但不能在同一类的其他实例上调用。

这里没有关于变量类型的内容,只有实例类型。

这很奇怪,我不明白。

谁能解释这里发生了什么?

0 投票
1 回答
34180 浏览

java - 为什么 Java 的 AbstractList 的 removeRange() 方法受到保护?

有谁知道,为什么AbstractList(以及ArrayList)中的removeRange 方法是protected?它看起来像是一个定义明确且有用的操作,但仍然要使用它,我们不得不继承 List 实现。

有什么隐藏的理由吗?对我来说似乎很莫名其妙。