积极答复者
关于属性访问的问题,急求!!

问题
-
//程序集 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
答案
-
这样不行吧。我要的不是 控制 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
全部回复
-
public class PClass { public int id { get; protected set; } } 可否?
- 已建议为答案 ThankfulHeartModerator 2012年8月20日 5:17
- 取消建议作为答案 Mike FengModerator 2012年8月22日 12:40
- 已建议为答案 Mike FengModerator 2012年8月22日 12:40
- 取消建议作为答案 ThankfulHeartModerator 2012年8月24日 1:06
-
-
你的说法有矛盾——
>>
你看如果我一个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元素,对不对?
-
感觉你还是没有听明白我的意思 。我的意思很明显 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
-
对呀,你的意思就是——直接派生于A的类都可以访问get和set;但是间接派生自A的类只能get而不能set,不是么?
另外我还是疑惑——既然你需要“不是派生自A的类”只能访问而不能set,难道说这个不是派生自A的类也有P属性么?
或许你的要求是:必须直接派生自A的类方可get/set,否则——
>>非派生自A的类 D(和A不在一个程序集)
非派生自A的类又是派生自哪儿的?父类是什么?
- 已标记为答案 Rainrcn 2012年8月24日 2:36
- 取消答案标记 ThankfulHeartModerator 2012年8月24日 2:38
-
这样不行吧。我要的不是 控制 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