这段代码:
abstract class C
{
protected abstract void F(D d);
}
class D : C
{
protected override void F(D d) { }
void G(C c)
{
c.F(this);
}
}
Run Code Online (Sandbox Code Playgroud)
生成此错误:
无法通过类型为"C"的限定符访问受保护的成员'CF(D)'; 限定符必须是'D'类型(或从中派生)
他们在想什么?(会改变那条规则会破坏某些东西吗?)除了让F公开之外,还有其他方法吗?
编辑:我现在明白为什么会这样(感谢格雷格),但我仍然对理性感到有些困惑; 给定:
class E : C
{
protected override void F(D d) { }
}
Run Code Online (Sandbox Code Playgroud)
为什么不应该 D是能够能够调用EF?
编辑错误消息,所以我可能会在那里输入错误.
我InvokeRepeating()用来在游戏中调用方法.我调用其中一个 类InvokeRepeating()的Start()方法GameObject.要设置repeatRate参数InvokeRepeating(),我传递一个名为的公共字段secondsBetweenBombDrops.
Unity忽略了我secondsBetweenBombDrops在代码中指定的值,而是在secondsBetweenBombDrops没有静态修饰符的情况下声明时使用了一些默认值(即1):
public float secondsBetweenBombDrops = 10f;
void Start() {
InvokeRepeating("DropBomb", 1f, secondsBetweenBombDrops);
}
Run Code Online (Sandbox Code Playgroud)
但是,一旦我添加static修饰符secondsBetweenBombDrops,代码就会按预期运行,并使用正确的值10:
public static float secondsBetweenBombDrops = 10f;
void Start() {
InvokeRepeating("DropBomb", 1f, secondsBetweenBombDrops);
}
Run Code Online (Sandbox Code Playgroud)
为什么此字段要求static修饰符使用适当的值?
在Unity检查器中,脚本组件显示secondsBetweenBombDrops为1.无论是在游戏开始时实例化预制件还是在游戏运行时创建预制实例,都会显示此默认值1.
我正在阅读一些Java文本,文本说我们只能为类和接口应用public或default访问修饰符.因此,如果我们声明:它是一个编译错误:
private class A {}
Run Code Online (Sandbox Code Playgroud)
要么
protected class A{}
Run Code Online (Sandbox Code Playgroud)
我只是好奇为什么类或接口无法接收private或protected访问修饰符?
在我的抽象课中,我有这样的事情:
public Object methodIWantToExpose(){
// ...
methodIDontWantExposed()
// ...
}
protected abstract void methodIDontWantExposed();
Run Code Online (Sandbox Code Playgroud)
问题是,我想强制扩展methodIDontWantExposed()的人使其受到保护,因为我不希望扩展类同时暴露methodIDontWantExposed和methodIWantToExpose.
有没有办法做到这一点(或一种可能避免我的问题的不同方法)?
我在package1中有一个名为A的类,在package2中有一个名为C的类.C类扩展了A类.
A有一个实例变量,声明如下:
protected int protectedInt = 1;
Run Code Online (Sandbox Code Playgroud)
这是A类的代码
package package1;
public class A {
public int publicInt = 1;
private int privateInt = 1;
int defaultInt = 1;
protected int protectedInt = 1;
}
Run Code Online (Sandbox Code Playgroud)
这是C类的代码:
package package2;
import package1.A;
public class C extends A{
public void go(){
//remember the import statement
A a = new A();
System.out.println(a.publicInt);
System.out.println(a.protectedInt);
}
}
Run Code Online (Sandbox Code Playgroud)
Eclipse强调了C.go()中的最后一行,并说"A.protectedInt"不可见.这似乎与oracle文档中给出的"protected"关键字的定义冲突.
protected修饰符指定只能在其自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问该成员.
这里发生了什么?
我有以下C#代码:
namespace ISeeOptic.BL
{
public abstract class Process
{
...
protected static void DeleteImages(List<ImagesPath> list)
{
some logic
}
...
}
protected class GetDataBL: Process
{
...
public static void DeleteImages(List<ImagesPath> list)
{
DeleteImages(list);
}
...
}
}
Run Code Online (Sandbox Code Playgroud)
在编译时我得到以下错误:
命名空间中定义的元素不能显式声明为private,protected或protected internal
我是C#的初学者所以也许这个问题可能看起来很幼稚,任何想法导致这个错误的原因是什么?
谢谢你提前.
我已经看过有关protected和package private修饰符之间差异的各种文章.有一件事我发现这两个帖子之间存在矛盾
在这个被接受的答案说
protected修饰符指定只能在其自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问该成员.
在这个被接受的答案说
要满足受保护级别访问,必须满足两个条件:
- 这些类必须在同一个包中.
- 必须有继承关系.
他们不矛盾吗?根据我对其他文章的理解,第一篇文章给出了正确的答案,即在其他包中保护== package-private + subclass.
如果此语句是正确的,那么为什么此代码失败,并在第17行的子类Cat上出现以下错误消息
The method testInstanceMethod() from the type Animal is not visible
Run Code Online (Sandbox Code Playgroud)
我的超级和子类代码如下.
package inheritance;
public class Animal {
public static void testClassMethod() {
System.out.println("The class" + " method in Animal.");
}
protected void testInstanceMethod() {
System.out.println("The instance " + " method in Animal.");
}
}
package testpackage;
import inheritance.Animal;
public class Cat extends Animal{
public static void testClassMethod() {
System.out.println("The class method" + " in Cat."); …Run Code Online (Sandbox Code Playgroud) 我有一个ComboBox和TextBox的用户控件.一切都很好,除了我注意到从我的用户控件的实例对象,我可以访问这两个控件.除非通过我自己的暴露属性,否则不应该访问它们.
为了使对象不可复制,我们可以显式删除其复制构造函数和复制分配运算符。
我的问题是:什么是做正确的地方-在public,private或protected之类的部分?并且-这种选择有什么区别吗?
access-modifiers ×10
c# ×4
java ×4
protected ×3
.net ×1
c++ ×1
c++11 ×1
overriding ×1
package ×1
visibility ×1
wpf ×1