面向对象的基本内容由:类、对象、属性、方法、字段构成。
面向对象的三大特性:继承、多态、封装。
关于面向对象的特性很多人都把目光转向了继承、多态和接口,却很少有人提及过封装。我也是在总结了继承、多态以后才考虑到,封装到底有些什么内容呢?
你是否也和我一样的疑问,你是否想起什么(想到什么可以在下面留言哦)。
…………
一.访问修饰符
public:同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型或成员(意思是都可以访问)。
private:只有同一类或结构中的代码可以访问该类型或成员(只有在定义的类或结构中可以,即使这个类的对象也不可用)。
protected:只有同一类或结构或者此类的派生类中的代码才可以访问的类型或成员。
internal:同一程序集中的任何代码都可以访问该类型或成员,但其他程序集中的代码不可以。
(以上定义来自MSDN)
用更简单的语言理解就是:
public:公有访问,没有限制。
private:只限本类使用。包括它的子类、对象(实例)都不能访问。
protected:只限本类、子类使用。本类和子类的对象也不能访问。
internal:只限于本项目使用。
注意:1.析构函数不能有访问修饰符。枚举成员始终是公共的,所以也不能应用任何访问修饰符。接口的访问修饰符也始终是public的,不然就失去意义了。因为结构不能继承,所以protected对结构也是无意义的。
2.成员的可访问性应低于包含成员的类型的可访问性。子类的访问性不能高于基类。
3.C#默认情况下,访问修饰符默认为private。在同一个命名空间默认为internal。
二.对字段的封装——属性
为了数据的安全性,封装的第一原则就是把字段定义为安全的private,避免对字段的修改引起巨大的错误。但是定义了private,我们想对字段进行修改怎么办?没错,就是属性帮了我们这个大忙。
1.属性的定义:属性是这样的成员:它们提供灵活的机制来读取、编写或计算私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。(MSDN上的介绍)
2.属性的表达式(类中):
private string filed; public string Filed { set{filed=value;} get{return filed;} }
get访问器:(读取属性时调用)
1.get 访问器体与方法体相似。它必须返回属性类型的值。执行 get 访问器相当于读取字段的值。
2.当没有对属性明确赋值时,一般调用的是get访问器。如果属性中只存在get访问器则这是一个只读属性。
3.get 访问器必须以 return 或 throw 语句终止,并且控制权不能离开访问器体。
4.还可以用于计算返回值,eg:get{return filed *2;}。但要注意的是直接更改它的对象状态很有可能引起副作用,eg:get{return filed++}(避免这样做)
5.还可以在get访问器前面添加访问修饰符。
set访问器:(设置属性时调用)
1.用于分配新值,它必须用关键字value,目的是把set这个访问器加入到属性中。在对属性进行赋值时,value代替了那个赋的值。
2.如果属性中只存在set,那么这个属性就是只写属性。
3.类似于get访问器,它也可以在前面加上访问修饰符,也可以用于表达计算值。eg:set{filed=value*100;}
注意:与字段不同,属性不能作为变量。所以它不能用ref和out参数传递。属性还可以定义为静态的(static),虚的(virtual),密封的(sealed),抽象的(abstract)。
属性具有多种用法:它们可在允许更改前验证数据;它们可透明地公开某个类上的数据,该类的数据实际上是从其他源(例如数据库)检索到的;当数据被更改时,它们可采取行动,例如引发事件或更改其他字段的值。
3.自动生成属性
自动属性其实是对标准属性的一种简写。
eg:public string Filed {get;set;}
此段代码在编译的时候自动生成私有字段,get和set访问器。把它转换为标准形式如下:
private string filed;
public string Filed
{
get{return value;}
set{filed=value;}
}
如果想生成自读属性可以把set定义为private,eg:public string Filed { get; private set; }
我们言归正传,再来思考一下属性的封装性:首先对字段来说,属性使得可以更改字段调用字段,明明是破坏了它的封装呀。其实属性的封装是从整体而言的。对于类来说,整体来说,属性帮助了整个类的有效封装。(个人觉得哈)
关于属性就介绍到这里,欢迎补充。
三.从整体看封装
上面介绍了属性对字段的封装。
其实封装的好处不言而喻。
在面向对象中我们经常提及到方法,类。其实封装性就表现在了这些地方,把一个操作封装在一起就成了方法,把对对象一系列的操作封装在一起就是类。当我们要用方法、类的时候也不用去在乎它的具体实现,直接就可以调用。它使得杂乱无章的东西有了逻辑。封装也广义的存在于其他表现地方,比如,接口,我觉得也是一种封装。
其实封装对于面向对象是有铺垫意义的,继承、多态也是在封装的基础上实现的。它就像面向对象这份午餐中的米饭,衬托出了继承、多态等等饭菜的香,因为它太过于平凡时常作为配角,也不易察觉。但是它的意义是很重大的。
……
水平有限,欢迎有贤之士继续补充。
说明:看博客的时候我发现一个问题,就是好的博客有人推荐,这是好事,对于写博客的人来说也是一种成就与向往。但是每个人视觉不一致,同时也有一些反对者发现了博客中的不妥与不对之处,反对对写博客的作者来说是很好的反思,请给他们一次机会:当你们反对的时候,希望能留下理由,以便于作者快速找到问题所在。谢谢合作!