有人可以向我解释protected/ public 内部课程有什么区别?
我知道public内部类是尽可能避免的(如本文所述).
但据我所知,使用protected或public修饰符之间没有区别.
看看这个例子:
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) 我今天正在进行一些代码审查,并遇到了一些开发人员编写的旧代码.它就是这样的
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)
这让我思考.为什么有人会将方法声明为内部抽象?
我知道InternalVisibleTo属性用于使用内部访问修饰符向指定的程序集公开类型和方法.我只使用它来将内部方法暴露给包含一组单元测试的单独程序集.
我正在努力想到应该使用它的另一个场景.该属性是否专门用于辅助单元测试,还是有其他原因?
我有三节课.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) 我正在努力改进我为Python程序编写单元测试用例的方法.我注意到在某些情况下,访问私有成员以确保方法正常运行会非常有帮助.一个示例案例是在尝试测试方法以确定没有预期返回值而非None的正确行为时.我知道这样做的简单方法就是将私有属性改为受保护属性,并直接测试它们.但是,我想找到一种不会暴露界面的方法.
那么如何测试类中的私有属性而不在接口中公开它们,或者,如果适用的话,更好的方法是测试这样的场景,以便正确的单元测试不一定需要私有属性访问?
我只是想知道私有和受保护的内部访问说明符之间的实际区别.我所知
可见自己的班级成员:私人和受保护的内部是
可见其他类为对象:两个 NO
可见的命名空间集合以外的其他类的对象:两个 NO
可见的命名空间集合外的子类为对象:两个 NO
如果私有与受保护的内部做同样的事情,为什么我们需要两者只是一个应该是否足够?
请考虑以下代码:
#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>)). …
如果我将创建一个如下所示的新对象,默认情况下它具有哪个访问修饰符?
Object objectA = new Object();
Run Code Online (Sandbox Code Playgroud) 由于Jigsaw项目的核心是Java模块系统,因此能够仅限制对特定模块内特定程序元素(类,方法和字段)的访问是很好的.
当模块中的某些元素对于此模块基本上是公共的时,它可能会有所帮助,但不应在此模块外部访问.
所以我说的是"package-local"之后的下一级访问,可以命名为"module-local".
然而,简要介绍Jigsaw规则和早期规范并没有帮助我弄清楚这种功能.更具体地说,该Modifier规范不包含任何新元素.
那么在未来的Java 9中还有其他任何可能吗?
假设我在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中有什么办法可以限制父类的某些字段到它的直接子类吗?
access-modifiers ×10
c# ×4
java ×3
.net ×2
inheritance ×2
assemblies ×1
c++ ×1
c++11 ×1
java-9 ×1
java-platform-module-system ×1
object ×1
oop ×1
overriding ×1
python ×1
restriction ×1
tdd ×1
testing ×1
unit-testing ×1