首页新闻找找看学习计划

FieldInfo.SetValue() 私有成员怎么也能赋值.这不违反OO原则么?

0
[待解决问题]

FieldInfo.SetValue() 私有成员怎么也能赋值.这不违反OO原则么?

紫陌轻风的主页 紫陌轻风 | 初学一级 | 园豆:48
提问于:2015-06-06 14:42
< >
分享
所有回答(3)
0

建议你贴上具体代码会好点。关于类私有成员,可以通过它提供的成员函数接口来操作私有成员,这是oo原则里允许的。

jiu~ | 园豆:444 (菜鸟二级) | 2015-06-06 15:47


_subRoutes这个是私有字段,如果FieldInfo.SetValue可以给它赋值,那么它跟公有字段有什么区别?而且属性封装也貌似没用。

支持(0) 反对(0) 紫陌轻风 | 园豆:48 (初学一级) | 2015-06-06 15:56

@紫陌轻风: 所谓封装,在于外界只能通过已提供的接口来访问或操作它,而不能直接操作其本身。说明白点就是,公有字段,你可以直接用.操作符来赋值,不需要调用函数,而私有字段,不可以用.来访问。如果你不喜欢私有字段被访问,就不设定接口,那么封装性就很好啊,外界没有办法操作它。

支持(0) 反对(0) jiu~ | 园豆:444 (菜鸟二级) | 2015-06-06 16:01

@jiu~: 这些我知道,但是我不明白FieldInfo.SetValue()为什么可以给私有字段赋值

支持(0) 反对(0) 紫陌轻风 | 园豆:48 (初学一级) | 2015-06-06 16:06

@紫陌轻风: 那么FieldInfo.SetValue()是用来干嘛的呢?如果是你,你会用什么方法去给它赋值呢?

支持(0) 反对(0) jiu~ | 园豆:444 (菜鸟二级) | 2015-06-06 16:11

@jiu~: 反射我也不是很明白,但是按我原来对OOP的理解,私有字段是不允许外界修改和访问的,但是FieldInfo.SetValue()就把我搞晕了。

支持(0) 反对(0) 紫陌轻风 | 园豆:48 (初学一级) | 2015-06-06 16:13

@紫陌轻风: 私有成员的特点在于访问等操作被设置了限制 并不是必须封死了 这个看笔者意愿 建议你自己试试写一些简单例子理解下 这个是概念问题 你好好理解一下 加油

支持(0) 反对(0) jiu~ | 园豆:444 (菜鸟二级) | 2015-06-06 16:21
0

虽然说要讲原则,但是也不能不通人情啊。

爱编程的大叔 | 园豆:29788 (高人七级) | 2015-06-06 16:09
0

从你贴的代码里已经看到了,你取FieldInfo的时候,BindingFlags是Instance和NonPublic,当然可以取出私有字段。

反射主要用于操作托管模块中的元数据,通过反射可以提供元数据中的类型信息,使得开发人员能够在运行时利用这些信息。

总结来说就是反射和OO没有直接的关系,面向对象和操作元数据是两个维度的事情。

JeffWong | 园豆:2021 (老鸟四级) | 2015-06-06 18:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册