如下代码:
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

解决方案 »

  1.   

    呵呵,你的理解有误! 
    按你的理解实际上无论java或net都是不允许访问的! 因为你是new出来的一个对象,这个和你继承不继承没有任何关系。 至于protected关键字只是表明你是否能在子类里使用base.x来访问xprotected 
    类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问 --java 
    仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的   --C# 
      

  2.   

    java里面有一种叫做默认的包访问,是可以的,就是不加访问控制符的默认级别
    加上protected就是受保护的了,只有继承类可以访问,你有没有在java中试一下呢,没有就不要下结论了
    在c#没有包访问的概念了,你的例子里面变量的收到保护的,只有继承类才可以访问的到
      

  3.   

    bc.protectedMember = 1;// not OK 如果你写成base.protectedMember  = 1 这才行,这才是protect,而你new出来的对象不管是不是自己的父类对于调用者来说都是外部的,
      

  4.   

    NO!
    在java中这是合法的,无论是1.4,5.0还是6.0 。现实情况是,InheritedClass是BaseClass的子类,他应该可以访问BaseClass中的所有protected字段。
    而在c#中,子类仅能访问本object的父类中的protected字段。
    如果在c#中没有设定其他访问权限限制类型来实现java中的protected的语义,我认为这是一个设计错误,至少是一个实现错误。以Cascade为代表的设计模式几乎必须使用到这种特性。
    虽然改为internal可以解决该问题,但是我确实不想把这种封装丢掉。
      

  5.   

    寒一下楼上诸位,是你们没在java中试验过吧。
    我一直在java中使用这个特性,一直很爽。
    最近要做个GUI的工具,所以来用c#,结果就碰到这个问题了,很是苦恼。对于protected的定义,都是基于类的,而非对象。
    而且从逻辑上,我可以访问某个类的A对象中的字段a,却不能访问其他对象的字段a,是不是很诡异呢?
      

  6.   

    而考虑如下代码:class BaseClass
    {
        private int member;
        public void Test()
        {
            BaseClass bc = new BaseClass();
            bc.member = 1; // OK
        }
    }
    同样的问题,在自己类之间就ok,遇到继承的父类的protected字段就被蔑视了。
    这算真的继承下来了么?
      

  7.   


    protected  
    类、类属变量及方法,包内的任何类,及包外的那些继承了此类的子类才能访问 --java  
    仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的   --C#  java有包概念,c#没有,你在java里继承另一个包内的类,你在试试你的写法能不能成功?
      

  8.   

    发现原因了,是由于java的protected相当于c#的protected internal
    可是仍然有疑惑: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。结贴。