none
关于属性访问的问题,急求!! RRS feed

  • 问题

  •  //程序集 1
        public class PClass
        {
            public int id { get; set; } //这里不知道怎么写
        }
        public class A
        {
            public A()
            {
                //可以修改P中的id值
                this.P.id=0;
            }
            public PClass P { get; protected set; }
        }
        //程序集 2
        public class B : A 
        {
            public B()
            {
                //可以修改P中的id值
                this.P.id=0;
            }
        }
        //程序集 3
        void Main()
        {
            //这里要求不能修改 A中 P 的 id 这个属性值
        }

    需求是: 我PClass如何做,才能使派生类可以查看并修改P中属性的值,而非派生类可以查看但是不能修改 P中属性的值?


    • 已编辑 Rainrcn 2012年8月19日 9:00
    2012年8月19日 8:29

答案

  • 这样不行吧。我要的不是 控制 PClass的派生类修改PClass的属性,而是控制 A的派生类 来修改PClass的属性。不知道能否实现 。



    这个要求有些强人所难,既然A不继承PClass,那么她想完全控制PClass,那么PClass的ID的get和set方法必须全是public。而如果只让派生自A的类能读写,那么又必须让A的P属性设置成protected,但是又不能满足非派生自A的类读P.ID,如要实现,除非在A类中添加一个public方法/属性获取P.ID.实在很无奈。

    public class PClass
    {
        public int ID { get; set; }
    }
    
    public class A
    {
        public A()
        {
            P = new PClass();
            P.ID = 0;
        }
        protected PClass P { get; private set; }
    
        public int PID 
        { 
            get { return P.ID; } 
        }
    }
    

    • 已标记为答案 Rainrcn 2012年8月24日 2:36
    2012年8月24日 2:22

全部回复

  • 请给出C和P,B各个类的定义方式和类?

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月19日 8:31
    版主
  • 已给出,请查看 谢谢。
    2012年8月19日 8:45
  • >> 我PClass如何做,才能使派生类可以查看并修改P中属性的值,而非派生类可以查看但是不能修改 P中属性的值?

    哪个派生类?派生自谁?


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月20日 1:30
    版主
  • public class PClass
    {
        public int id { get; protected set; } 
    }
    
    可否?

    2012年8月20日 2:46
  • 我说的派生类是 继承自A的类。并且这个类和A不在一个程序集中。
    • 已编辑 Rainrcn 2012年8月24日 1:04
    2012年8月24日 1:04
  • 我说的派生类是 继承自A的类。并且这个类和A不在一个程序集中。

    那你的方法完全可以啊。

    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月24日 1:06
    版主
  • 这样不行吧。我要的不是 控制 PClass的派生类修改PClass的属性,而是控制 A的派生类 来修改PClass的属性。不知道能否实现 。



    • 已编辑 Rainrcn 2012年8月24日 1:08
    2012年8月24日 1:06
  • >>我要的不是 控制 PClass的派生类修改PClass的属性,而是控制 A的派生类 来修改PClass的属性。不知道能否实现

    没有理解你的意思……


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月24日 1:10
    版主
  • 这么说吧 。你看如果我一个A的子类  C  在别的程序集中。 那么如果 A里面有个属性是   

    public int Number { get; protected set; }

    //那么我C便能get和 set 对吧。

    那么如果我A属性是 public PClass P { get; protected set; }

    //那我C也能get和set P 这个对象 对吧。

    //那么 我如果想 get 和set P里面的属性。是否也应该需要一个控制吧。

    //那么我想这个控制是 派生自 A的子类能get和set 。非派生自A的类 只能get 不能set。

    2012年8月24日 1:20
  • 你的说法有矛盾——

    >>

    你看如果我一个A的子类  C  在别的程序集中。 那么如果 A里面有个属性是  

    public int Number { get; protected set; }

    //那么我C便能get和 set 对吧。

    那么如果我A属性是 public PClass P { get; protected set; }

    //那我C也能get和set P 这个对象 对吧。

    以上我引用你说的,你都是说C直接继承A,当然可以get和set;但是:

    >>那么我想这个控制是  派生自 A的子类能get和set 。非派生自A的类 只能get 不能set。

    本来就派生自A的啊!(C类)。非派生子A的类当然只能get了。

    我猜想,你的意思是:

    假设B继承自A,C又继承自B,那么C不能访问A的set元素,对不对?


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月24日 1:27
    版主
  • 感觉你还是没有听明白我的意思 。我的意思很明显 Number 和 P 这两个A中的属性是A的派生类直接可以 get和set的。

    例如 :

    A.Number=0;

    int i = A.Number ;

    A.P = new PClass();

    PClass pt = A.P;

    我的需求是:

    A的派生类C(和A不在一个程序集):

    C.P.Id=0; //可以

    int i = C.P.Id;//可以

    非派生自A的类 D(和A不在一个程序集)

    A a= new A();

    a.P.Id = 0;//这里不能它set

    int i = a.P.Id;//这里可以get.

    不知道这么写您是否能明白


    • 已编辑 Rainrcn 2012年8月24日 2:04
    2012年8月24日 2:03
  • 对呀,你的意思就是——直接派生于A的类都可以访问get和set;但是间接派生自A的类只能get而不能set,不是么?

    另外我还是疑惑——既然你需要“不是派生自A的类”只能访问而不能set,难道说这个不是派生自A的类也有P属性么?

    或许你的要求是:必须直接派生自A的类方可get/set,否则——

    >>非派生自A的类 D(和A不在一个程序集)

    非派生自A的类又是派生自哪儿的?父类是什么?


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年8月24日 2:17
    版主
  • 这样不行吧。我要的不是 控制 PClass的派生类修改PClass的属性,而是控制 A的派生类 来修改PClass的属性。不知道能否实现 。



    这个要求有些强人所难,既然A不继承PClass,那么她想完全控制PClass,那么PClass的ID的get和set方法必须全是public。而如果只让派生自A的类能读写,那么又必须让A的P属性设置成protected,但是又不能满足非派生自A的类读P.ID,如要实现,除非在A类中添加一个public方法/属性获取P.ID.实在很无奈。

    public class PClass
    {
        public int ID { get; set; }
    }
    
    public class A
    {
        public A()
        {
            P = new PClass();
            P.ID = 0;
        }
        protected PClass P { get; private set; }
    
        public int PID 
        { 
            get { return P.ID; } 
        }
    }
    

    • 已标记为答案 Rainrcn 2012年8月24日 2:36
    2012年8月24日 2:22
  • 好吧我也感觉这个问题有点强人所难了。谢谢您的回答:)
    2012年8月24日 2:34
  • D不是间接继承,而是就不继承的。

    我感觉这个问题可能真是没法解决。如果是那样的话 也许是我本身类库的设计问题。

    2012年8月24日 2:35