标签: access-modifiers

受保护/公共内部类

有人可以向我解释protected/ public 内部课程有什么区别?

我知道public内部类是尽可能避免的(如本文所述).

但据我所知,使用protectedpublic修饰符之间没有区别.

看看这个例子:

public class Foo1 {
 public Foo1() { }

 protected class InnerFoo {
  public InnerFoo() {
   super();
  }
 }
}
Run Code Online (Sandbox Code Playgroud)

...

public class Foo2 extends Foo1 {
 public Foo2() {
  Foo1.InnerFoo innerFoo = new Foo1.InnerFoo();
 }
}
Run Code Online (Sandbox Code Playgroud)

...

public class Bar {
 public Bar() {
  Foo1 foo1 = new Foo1();
  Foo1.InnerFoo innerFoo1 = foo1.new InnerFoo();

  Foo2 foo2 = new Foo2();
  Foo2.InnerFoo innerFoo2 = foo2.new …
Run Code Online (Sandbox Code Playgroud)

java access-modifiers inner-classes

14
推荐指数
1
解决办法
2万
查看次数

内部抽象方法.为什么有人会拥有它们?

我今天正在进行一些代码审查,并遇到了一些开发人员编写的旧代码.它就是这样的

public abstract class BaseControl
{
    internal abstract void DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

如果在同一个程序集中有派生类,它就可以工作

public class DerivedControl : BaseControl
{
    internal override void DoSomething()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在不同的程序集中派生基类会产生编译时错误

DerivedControl does not implement inherited abstract member 'BaseControl.DoSomething()
Run Code Online (Sandbox Code Playgroud)

这让我思考.为什么有人会将方法声明为内部抽象?

c# inheritance abstract-class overriding access-modifiers

14
推荐指数
2
解决办法
3541
查看次数

什么时候应该使用[assembly:InternalsVisibleTo()]?

我知道InternalVisibleTo属性用于使用内部访问修饰符向指定的程序集公开类型和方法.我只使用它来将内部方法暴露给包含一组单元测试的单独程序集.

我正在努力想到应该使用它的另一个场景.该属性是否专门用于辅助单元测试,还是有其他原因?

.net assemblies access-modifiers internalsvisibleto

14
推荐指数
3
解决办法
2718
查看次数

由于其保护级别,类无法访问

我有三节课.all都是同一命名空间的一部分.这是三个类的基础知识.

//FBlock.cs
namespace StubGenerator.PropGenerator
{
    class FBlock : IDesignRegionInserts, IFormRegionInserts, IAPIRegionInserts,  IConfigurationInserts, ISoapProxyClientInserts, ISoapProxyServiceInserts
    {
        private List<Property> pProperties;
        private List<Method> pMethods;
        public FBlock(string aFBlockName)
        { 
            pProperties = new List<Property>();
            pMethods = new List<Method>();
        }

        public Property AddProperty(string aName)
        {
            Property loProp = new Property(this, aName, pProperties.Count);
            pProperties.Add(loProp);
            return loProp;
         }

         public Method AddMethod(string aName)
         {
             Method loMeth = new Method(this, aName);
             pMethods.Add(loMeth);
             return loMeth;
         }
     }

 //Method.cs
 namespace StubGenerator.PropGenerator
 {
     class Method : IPropertyName
     {
         private List<StubGenerator.PropGenerator.PropertyAttribute> pPropertyAttributes;
         private string …
Run Code Online (Sandbox Code Playgroud)

c# access-modifiers

14
推荐指数
2
解决办法
17万
查看次数

在Python中,如何编写可以访问私有属性而不暴露它们的单元测试?

我正在努力改进我为Python程序编写单元测试用例的方法.我注意到在某些情况下,访问私有成员以确保方法正常运行会非常有帮助.一个示例案例是在尝试测试方法以确定没有预期返回值而非None的正确行为时.我知道这样做的简单方法就是将私有属性改为受保护属性,并直接测试它们.但是,我想找到一种不会暴露界面的方法.

那么如何测试类中的私有属性而不在接口中公开它们,或者,如果适用的话,更好的方法是测试这样的场景,以便正确的单元测试不一定需要私有属性访问?

python testing tdd unit-testing access-modifiers

14
推荐指数
2
解决办法
1万
查看次数

"私人"和"受保护的内部"有什么区别?

我只是想知道私有受保护的内部访问说明符之间的实际区别.我所知

可见自己的班级成员:私人和受保护的内部

可见其他类为对象:两个 NO

可见的命名空间集合以外的其他类的对象:两个 NO

可见的命名空间集合外的子类为对象:两个 NO

如果私有受保护的内部做同样的事情,为什么我们需要两者只是一个应该是否足够?

.net c# oop access-modifiers

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

私有构造函数禁止使用emplace [_back]()来避免移动

请考虑以下代码:

#include <vector>

class A
{
public:    
    A(A&&);  // somewhat expensive

    static std::vector<A> make_As()
    {
        std::vector<A> result;
        result.push_back(A(3));
        result.push_back(A(4));
        return result;
    }

private:
    A(int);  // private constructor
};
Run Code Online (Sandbox Code Playgroud)

因为A移动构造函数有些昂贵(无论出于何种原因),我想避免调用它并使用emplace_back():

#include <vector>

class A
{
public:    
    A(A&&);  // somewhat expensive

    static std::vector<A> make_As()
    {
        std::vector<A> result;
        result.emplace_back(3);
        result.emplace_back(4);
        return result;
    }

private:
    A(int);  // private constructor
};
Run Code Online (Sandbox Code Playgroud)

不幸的是,emplace_back()实际的构造函数调用是由标准库中的某些东西完成的,它没有足够的特权来调用A私有构造函数.

我意识到可能没有什么可以做的,但是我觉得既然调用emplace_back()发生在一个成员中A,他们应该能够调用私有构造函数.

这有什么变通方法吗?

我唯一能想到的是添加一个friend-declaration A,但是需要成为A朋友的精确类(即实际尝试调用构造函数的类)是特定于实现的(例如,for海湾合作委员会(GCC __gnu_cxx::new_allocator<A>)). …

c++ access-modifiers move-semantics c++11

14
推荐指数
2
解决办法
1724
查看次数

C#中的默认访问修饰符

如果我将创建一个如下所示的新对象,默认情况下它具有哪个访问修饰符?

Object objectA = new Object();
Run Code Online (Sandbox Code Playgroud)

c# object access-modifiers

13
推荐指数
1
解决办法
7101
查看次数

Java 9中的"模块本地"访问行为

由于Jigsaw项目的核心是Java模块系统,因此能够仅限制对特定模块内特定程序元素(类,方法和字段)的访问是很好的.

当模块中的某些元素对于此模块基本上是公共的时,它可能会有所帮助,但不应在此模块外部访问.

所以我说的是"package-local"之后的下一级访问,可以命名为"module-local".

然而,简要介绍Jigsaw规则和早期规范并没有帮助我弄清楚这种功能.更具体地说,Modifier规范不包含任何新元素.

那么在未来的Java 9中还有其他任何可能吗?

java access-modifiers java-platform-module-system java-9

13
推荐指数
2
解决办法
1634
查看次数

仅限父类成员到其直接子类

假设我在java中有四个具有给定层次结构的类.

class A {}
class B extends A {} 
class C extends B {} 
class D extends C {} 
Run Code Online (Sandbox Code Playgroud)

根据我的理解,A类的所有可访问字段将通过继承可用于其所有子类.现在,如果我希望A类的几个字段只能用于B类.

在java中有什么办法可以限制父类的某些字段到它的直接子类吗?

java inheritance access-modifiers restriction

13
推荐指数
2
解决办法
1283
查看次数