标签: access-modifiers

为什么我不能访问C#受保护的成员,除非像这样?

这段代码:

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?


编辑错误消息,所以我可能会在那里输入错误.

c# overriding protected access-modifiers

38
推荐指数
4
解决办法
3万
查看次数

为什么Unity忽略了非静态公共字段的初始化值?

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.

c# serialization access-modifiers unity-game-engine

37
推荐指数
1
解决办法
7804
查看次数

为什么类或接口不能接收私有或受保护的访问修饰符?

我正在阅读一些Java文本,文本说我们只能为类和接口应用publicdefault访问修饰符.因此,如果我们声明:它是一个编译错误:

private class A {}
Run Code Online (Sandbox Code Playgroud)

要么

protected class A{}
Run Code Online (Sandbox Code Playgroud)

我只是好奇为什么类或接口无法接收privateprotected访问修饰符?

java access-modifiers

36
推荐指数
3
解决办法
2万
查看次数

当某人覆盖它们时,我可以强制抽象方法受到保护吗?

在我的抽象课中,我有这样的事情:

public Object methodIWantToExpose(){
  // ... 
  methodIDontWantExposed()
  // ...
}

protected abstract void methodIDontWantExposed();
Run Code Online (Sandbox Code Playgroud)

问题是,我想强制扩展methodIDontWantExposed()的人使其受到保护,因为我不希望扩展类同时暴露methodIDontWantExposed和methodIWantToExpose.

有没有办法做到这一点(或一种可能避免我的问题的不同方法)?

java access-modifiers

36
推荐指数
5
解决办法
3288
查看次数

.NET中受保护的类

一个类可以在.NET中受到保护吗?
为什么这不可能?

.net c# access-modifiers

35
推荐指数
2
解决办法
3万
查看次数

了解java的protected修饰符

我在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一样),此外,还可以在另一个包中通过其类的子类访问该成员.

这里发生了什么?

java visibility protected access-modifiers

35
推荐指数
3
解决办法
1万
查看次数

为什么无法显式声明命名空间中定义的元素?

我有以下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#的初学者所以也许这个问题可能看起来很幼稚,任何想法导致这个错误的原因是什么?

谢谢你提前.

c# access-modifiers

34
推荐指数
3
解决办法
3万
查看次数

Java中的protected和package-private访问修饰符之间的区别?

我已经看过有关protected和package private修饰符之间差异的各种文章.有一件事我发现这两个帖子之间存在矛盾

  1. "包私有"成员访问是否与默认(无修饰符)访问同义?

    在这个被接受的答案说

    protected修饰符指定只能在其自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问该成员.

  2. 为什么受保护的修饰符在Java子类中的行为方式不同?

    在这个被接受的答案说

    要满足受保护级别访问,必须满足两个条件:

    • 这些类必须在同一个包中.
    • 必须有继承关系.

他们不矛盾吗?根据我对其他文章的理解,第一篇文章给出了正确的答案,即在其他包中保护== 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)

java protected access-modifiers package

34
推荐指数
2
解决办法
4万
查看次数

如何将UserControl中的控件设为私有?

我有一个ComboBox和TextBox的用户控件.一切都很好,除了我注意到从我的用户控件的实例对象,我可以访问这两个控件.除非通过我自己的暴露属性,否则不应该访问它们.

wpf user-controls access-modifiers

32
推荐指数
1
解决办法
4869
查看次数

删除版权副本和版权转让-是公共的,私人的还是受保护的?

为了使对象不可复制,我们可以显式删除其复制构造函数和复制分配运算符。

我的问题是:什么是做正确的地方-在publicprivateprotected之类的部分?并且-这种选择有什么区别吗?

c++ access-modifiers deleted-functions c++11

32
推荐指数
4
解决办法
1919
查看次数