如下代码:
class BaseClass
{
protected int protectedMember;
} class InheritedClass: BaseClass
{
public void Test()
{
this.protectedMember = 1; // OK. BaseClass bc = new BaseClass();
bc.protectedMember = 1;// not OK
}
}
子类可以访问自己的父类的protected member,但是却不能访问其他父类对象的protected member。除了改成internal的访问限制类型,有没有其他办法?
在做Cascade时,很受困扰。另外,java中这种访问是合法的。运行环境是.Net 1.1
class BaseClass
{
protected int protectedMember;
} class InheritedClass: BaseClass
{
public void Test()
{
this.protectedMember = 1; // OK. BaseClass bc = new BaseClass();
bc.protectedMember = 1;// not OK
}
}
子类可以访问自己的父类的protected member,但是却不能访问其他父类对象的protected member。除了改成internal的访问限制类型,有没有其他办法?
在做Cascade时,很受困扰。另外,java中这种访问是合法的。运行环境是.Net 1.1
解决方案 »
- 提问如内容 有空的进来看看
- 如何知道一个网站是否需要带有COOKIE做某些事情呢?
- picturebox的Resources中导入的图片怎么随即调用
- 怎么利用AdventNet SNMP API .NET做一个简单的对代理端的trap收发?
- 服务器被黑了 郁闷,大热天 跪太阳下求救
- 100分求如何将Excel导入到access中,
- 零基础学c#要多久才算入门?
- C#怎么实现鼠标自动点击功能
- 急需C#编写的修改登陆密码的代码,大家帮忙啊!
- 向高手求教,c#与outlook的问题!!!(我仅有的250分,分了三次给这个问题,我已成了0分了),没人知道吗?
- 关于如何一个定义变量
- C#中一个Nhibernate报错问题
按你的理解实际上无论java或net都是不允许访问的! 因为你是new出来的一个对象,这个和你继承不继承没有任何关系。 至于protected关键字只是表明你是否能在子类里使用base.x来访问xprotected
类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问 --java
仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的 --C#
加上protected就是受保护的了,只有继承类可以访问,你有没有在java中试一下呢,没有就不要下结论了
在c#没有包访问的概念了,你的例子里面变量的收到保护的,只有继承类才可以访问的到
在java中这是合法的,无论是1.4,5.0还是6.0 。现实情况是,InheritedClass是BaseClass的子类,他应该可以访问BaseClass中的所有protected字段。
而在c#中,子类仅能访问本object的父类中的protected字段。
如果在c#中没有设定其他访问权限限制类型来实现java中的protected的语义,我认为这是一个设计错误,至少是一个实现错误。以Cascade为代表的设计模式几乎必须使用到这种特性。
虽然改为internal可以解决该问题,但是我确实不想把这种封装丢掉。
我一直在java中使用这个特性,一直很爽。
最近要做个GUI的工具,所以来用c#,结果就碰到这个问题了,很是苦恼。对于protected的定义,都是基于类的,而非对象。
而且从逻辑上,我可以访问某个类的A对象中的字段a,却不能访问其他对象的字段a,是不是很诡异呢?
{
private int member;
public void Test()
{
BaseClass bc = new BaseClass();
bc.member = 1; // OK
}
}
同样的问题,在自己类之间就ok,遇到继承的父类的protected字段就被蔑视了。
这算真的继承下来了么?
protected
类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问 --java
仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的 --C# java有包概念,c#没有,你在java里继承另一个包内的类,你在试试你的写法能不能成功?
可是仍然有疑惑:class BaseClass
{
protected int protectedMember;
}class InheritedClass: BaseClass
{
private int member;
public void Test()
{
BaseClass bc = new BaseClass();
//bc.member = 1; // Not OK InheritedClass ic = new InheritedClass();
ic.member = 1; // OK
ic.protectedMember = 1; // OK
}
}IC不能访问其他BC类的对象protected字段,却可以访问其他IC对象继承自BC的protected字段。可以这样理解的是,在类方法里面,可以访问该类的任意对象的任意字段;
而当类方法中有其他类型的对象时,c#与java均不会解析这“其他类型”是否与当前类型有继承上的关系,就是当作其他类型处理,只能访问public接口。(java实质上没有与c#中的protected有相同含义的限制类型,也许也有原因是来解决此类问题的)个人认为protected的这种语义不十分合理。ps:C#有一个对应的internal关键字,其对应的范围是assembly。结贴。