我正在学习Java,我正在阅读的书中有关于克隆的以下示例.在clone(),我的第一个实例能够在新对象上设置缓冲区,即使缓冲区是private.似乎它应该要求该字段protected为此工作.
为什么允许这样做?是否clone()具有允许其访问private字段的特殊权限?
public class IntegerStack implements Cloneable {
private int[] buffer;
private int top;
// ... code omitted ...
@Override
public IntegerStack clone() {
try{
IntegerStack nObj = (IntegerStack) super.clone();
nObj.buffer = buffer.clone();
return nObj;
} catch (CloneNotSupportedException e)
{
throw new InternalError(e.toString());
}
}
}
Run Code Online (Sandbox Code Playgroud) 当我在WPF中创建用户控件时,看起来这个控件的所有子节点都被声明为内部控件?我无法验证这一点,也没有找到任何资源来讨论这个问题.
我可以访问同一程序集中的控件,但不能访问引用用户控件所在程序集的项目.有没有办法覆盖XAML中子控件的默认访问修饰符,所以我不必手动通过用户控件中的属性公开控件?
问候.
我有两个班,'数据库'和'组'.我希望能够在"数据库"中创建"组"实例并在这些实例上调用方法,并能够公开分发"组"实例引用.但是,我不想提供对"组"中的构造函数或其他方法的公共访问.
我原本以为我可以通过使'Group'成为'Database'的私有内部类来实现这种访问限制,但我发现如果它是私有的,我不能公开分发对'Group'的引用.此外,我将'Group'设为公共内部类的尝试失败了,因为如果它的方法都是私有的,'Database'无法访问它们,如果它们是公共的,那么访问可能超出'Database'.
我正在寻找解决或避免这个问题的最佳实践技术.也许我错过了某个必要的关键字?到目前为止,我在研究中发现的任何内容都表明C#允许这种控制粒度.我找到了解决问题的混乱方法,正如我在下面的代码中提供的那样.它的本质是这样的:在"数据库"中每次调用"组"中的方法之前,在"数据库"中设置一个字段,可以公开读取,但只能私下设置,"组"的方法都会检查它们的创建实例'数据库'在执行预期的操作之前.在读取字段时(通过"数据库"中的公共方法),字段将被重置,防止对"组"进行任何进一步的方法调用,直到"数据库"再次设置字段.
public class Database {
// Field; true if Database has just authorized a method call to a %Group.
private bool group_isNextCallAuthorized = false;
// Invoked before every method call to a %Group.
private void Group_AuthorizeNextCall() {
group_isNextCallAuthorized = true;
}
// Method, ordinarily called from %Group, that checks its creating %Database
// that the %Database itself authorized the method call on the %Group. It
// automatically resets the authorization to false to prepare for the …Run Code Online (Sandbox Code Playgroud) Resharper非常棒,就像任何fule kno一样.
但是,如果我声明一个方法:
private void MethodName() { //code in here }
Run Code Online (Sandbox Code Playgroud)
或者枚举:
public enum SomeEnum { Value1, Value2 }
Run Code Online (Sandbox Code Playgroud)
Resharper不建议删除冗余访问修饰符......为什么不呢?
我有一个内部抽象类InternalClassBase和两个(也内部)类InternalClass1和InternalClass2,它从继承InternalClassBase.
我也有一个公共抽象类PublicClassBase和两个(也公开)班PublicClass1和PublicClass2,从继承PublicClassBase.
该PublicClassBase有一个受保护的成员XXX类型InternalClassBase,这样既PublicClass1和PublicClass2可以使用它.
这是我的代码:
internal abstract class InternalClassBase { }
internal class InternalClass1 : InternalClassBase { }
internal class InternalClass2 : InternalClassBase { }
public abstract class PublicClassBase
{
protected InternalClassBase XXX; // this is where the error happens
}
public class PublicClass1 : PublicClassBase { }
public class PublicClass2 : PublicClassBase { } …Run Code Online (Sandbox Code Playgroud) 我正在提出一个关于protectedvs 的问题(protected internal因为我仍然不确定,并且无法控制它们).
任何帮助深表感谢.
// DLL 1
namespace Assembly1
{
class class1 : class2
{
static void Main()
{
new class1().Test();
}
private void Test()
{
Console.WriteLine(this.sample);
}
}
}
Run Code Online (Sandbox Code Playgroud)
// DLL 2
namespace Assembly2
{
public class class2
{
// protected string sample = "Test";
protected internal string sample = "Test";
//Same behavior when using protected and protected internal. Why ?
}
}
Run Code Online (Sandbox Code Playgroud)
我对这两行都有相同的行为.
// protected string sample = "Test";
protected internal string sample = …Run Code Online (Sandbox Code Playgroud) 是否可以知道函数或过程是私有的,受保护的还是公共的.现在我必须滚动到顶部以查看方法是否是私有的.是否有工具或结构(代码资源管理器),以查看方法是私有,受保护或公共whitout滚动到顶部.
例:
unit .....
// 100 line code
private
// 1000 line code
procedure A(); // <-- Here I can't see if the procedure is private. Must scroll to the top
// 2000 line code
...
procedure A(); // <-- Here I can't see if the procedure is private. Must scroll to the top
begin
...
end;
Run Code Online (Sandbox Code Playgroud)
我现在唯一可以设置(私有,保护或公开)它的摘要描述
在Code Explorer中,我看到蓝色表示程序,绿色表示功能,但没有私人,受保护或公共图标.
我更改了探索代码的属性,现在我有私有,受保护或pulic的地图.
但是当我转到代码中的过程时,探索代码中没有像项目管理器视图中那样的选定项.探索代码的情况相同.必须向上滚动到地图以查看它是否是私有的,受保护的或公共的.一个替换是在搜索已探索的代码时编写方法.然后,这是一个提示弹出窗口.
我找到了可能的解决方案:将方法和过去复制到资源管理器代码的搜索框中.组合框列表弹出窗口给了我想要看到的内容(私有,受保护......)
早在2004年,当我在RIT参加CS课程的介绍时,我的教授非常强调我们记得放入访问修饰语.没有它,默认访问将是公开的,我记得教授说的.也许我的记忆是错的,教授实际上并没有说出来,但显然现在情况并非如此.我想知道在某些时候是否曾经是这种情况,也许Sun在2004年之后的某些时候改变了它?
我试图指定val常量只对一个对象可见:
object Config {
private[my.pack.MyObject] val Some = Option("String")
}
// in package my.pack
object MyObject {
val Other = Config.Some
}
Run Code Online (Sandbox Code Playgroud)
在编译时我得到一个错误:
[error] C:\path\Config.scala:17: ']' expected but '.' found.
[error] private[my.pack.MyObject] val Some = Option("String")
[error] ^
Run Code Online (Sandbox Code Playgroud)
怎么了?当我读到访问限定符时,它们可以是类或对象,而不是包,我错了吗?
在我的C#程序中,我有几个我自己的接口,我想保持我的程序集内部.
internal interface Doable {
void DoSomething ();
}
internal interface Informable {
void SomethingHappened (Doable obj);
}
Run Code Online (Sandbox Code Playgroud)
我有一个抽象类,它不能是内部的,它抽象地实现了两个接口,就像这样.
public abstract class MyAbstractClass : Doable, Informable {
internal abstract void DoSomething ();
internal abstract void SomethingHappened (Doable obj);
// Other methods
}
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我得到一个MyAbstractClass没有实现的错误Doable.DoSomething()(以及SomethingHappened(Doable obj)同样).
我可以将抽象实现的访问修饰符更改DoSomething()为public(然而,我首先不想这样做),但后来SomethingHappened(Doable obj)是另一回事:它抱怨(正确地说)接口Doable是内部的(因此这是方法可能没有public访问修饰符).
我处于两难境地.我基本上希望将两个接口及其所有具体实现的方法保持在内部程序集中的所有类中,外部调用者不知道它们的存在.
想知道怎么回事?