转自:http://www.jb51.net/article/42390.htm

众所周知,面向对象编程的特点为:封装、继承、多态。C#是一门完全面向对象的语言,由于比Java推出的时间还要晚,所以对面向对象的思想的体现比Java还要完美,那么在C#中如何体现封装、继承和多态呢?下面举例并进行说明。

1.封装

封装的好处有以下几点:

①数据不外泄,可以做到一定的保护

②类的使用者不用考虑具体的数据运算,方便

③程序结构性强,层次清晰,便于维护

对相关的字段、方法进行封装固然对面向对象编程起到不可缺少的重要作用,但并不代表不可以访问类或者说具体的实例化对象中的内容,而且为使用者提供接口,仅仅让他们调用就可以了,他们只做他们的工作,不需要考虑或者顾及你写的类具体是做什么的,更不用考虑你写的每一行代码是什么意思。

在C#中,对于变量的封装,往往将需要被在本类以外调用的,以属性的形式出现,而不像C++中是直接以public成员或者private成员加上相关的方法调用,那样要么不符合面向对象的特点,要么太麻烦。

C#中属性的声明:

 public class TestClass
{
public string Info
{
get;
set;
}
}

属性的声明类似一个函数,首先有访问级别(如果设成private等于设成私有字段,还不如直接写个变量),然后是类型,接着是属性名,后面是一对花括号,里面的get、set用于控制属性只读,还是只写,还是可读可写。当然,这里的get、set都是直接以分号结束,被称作是自动属性,如果有需要,也可以自定义get和set,get中需要加上和属性类型一直的返回类型。

C#对方法的封装只需要改变方法的访问级别,比如设为public,或者设为private(或者不写),对应的就是可从外部访问以及仅能从内部访问。

2.继承

大家都知道继承机制可以提高代码的可复用性和可扩展性,以提高开发效率,减少代码量。C#和C++不同,可从一个类继承或实现多个接口,但不可以从多个类继承。

继承语法示例:

 class Son : Father
{
//Do Something
}

继承可以使子类或者说派生类获得父类或者说基类的所有可被继承的内容,比如字段、方法,但对访问级别有一定限制,那就是private级别不可被继承。除了这点,这里需要说明的是,如果需要调用基类(父类)中的成员,需要使用base关键字,而如果在方法中,需要使用当前类中的成员,但因为重名(比如参数和类成员变量重名),需要使用this关键字来确定到底访问的是哪个成员。

C#所有的类都继承自System.Object,所以不管是什么类都有几个固定的、公共的方法,这是C#体现面向对象思想非常不错的一点!

下来说一下静态类的特征:

①静态类不能使用sealed或abstract修饰符

②静态类必须直接继承自System.Object,不能是其他

③静态类不能实现任何接口

④静态类不能包含任何操作符

⑤静态类不能包含使用protected或protected internal修饰的静态成员

⑥静态类智能包含静态成员

⑦静态类可以包含静态构造函数,但不能包含实例构造函数

⑧静态类不能被实例化

⑨静态类是密封的,不能被继承

由于静态类是在加载包含该类的程序集时由CLR自动加载,所以用静态类实现一些不操作数据,并且不与代码中的特定对象关联的方法是非常不错的选择。

剩下要注意的就是在使用继承的时候,搞清构造函数的调用顺序,先初始化类的实例字段,再调用基类构造函数,最后调用自己的构造函数。

3.多态

通过基类的引用调用在派生类中实现的方法时,不同的派生类将产生不同的调用结果,这就是多态,而C#中的多态分为运行时多态和编译时多态。编译时多态利用函数重载实现,运行时多态通过覆写虚方法实现。

①方法重载

前提:在同一个类中,方法名相同,方法签名不同(包括方法的名称及参数信息(形参的修饰符、数目、类型以及泛型参数的数目),但返回值类型、形参和类型参数的名称并不属于方法签名的一部分)

方法重载示例:

 public string Function(int x)
{
return x.ToString();
}
public string Function(DateTime x)
{
return x.ToString("yyyy-MM-dd HH:mm:ss.fff");
}
public string Function(double x,double y)
{
return (x+y).ToString();
}

以上示例实现了一个名为Function,返回类型为string的三种重载,分别是将一个int型参数返回为string型,将一个DateTime型参数返回为“年-月-日 时:分:秒.毫秒”格式的字符串,将两个double型参数相加的和转换为string类型

②虚方法

定义虚方法需要使用virtual关键字,如下所示:

 class Car
{
public virtual void Drive()
{
Console.WriteLine("驾驶..");
}
}

之所以将Drive设置为虚方法,就是为了让派生的子类去重写,这样所有Car的派生类都可以实现新的Drive方法。

注意:virtual关键字必须位于返回方法的返回类型之前,虚方法可以有方法体,而抽象方法不允许有方法体

剩下两项注意:静态成员函数不能是虚函数,构造函数不能是虚函数

覆写方法示例:

 class Track : Car
{
public override void Drive()
{
Console.WriteLine("开大卡车");
}
}
class Jeep : Car
{
public override void Drive()
{
Console.WriteLine("开吉普车");
}
}

③抽象类及抽象方法
有以下几点注意:(1)它们不能被实例化(2)抽象方法不能有方法体,所在类必须是抽象类(3)使用abstract关键字(4)抽象方法无实现,后面紧跟分号(5)抽象类的派生类必须实现所有抽象方法(6)当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。

具体的例子就不举了

4.总结

所有的面相对象思想,归根结底是为了简化代码,减少代码量,构建更符合现实生活逻辑的程序代码,从而减轻程序员的负担。不能一味地或者说刻意地去使用面相对象的思想而忽略了程序所实现的功能或者框架,要根据实际情况,合理利用面相对象思想,减轻负担,并为他人提供方便!

C#面向对象特征的具体实现及作用详解的更多相关文章

  1. Linux(centos)系统各个目录的作用详解

    Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码 ...

  2. shell脚本中常见的一些特殊符号和作用详解

    这篇文章主要介绍了shell脚本中常见的一些特殊符号和它的作用详解,总结的很简洁,容易看懂,需要的朋友可以参考下   在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我 ...

  3. linux(CENTOS)系统各个目录的作用详解

    Linux(CentOS)系统各个目录的作用详解 文件的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.S ...

  4. MySQL中的主键,外键有什么作用详解

    MySQL中的主键,外键有什么作用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学关系型数据库的同学,尤其在学习主键和外键时会产生一定的困惑.那么今天我们就把这个困惑连根拔起 ...

  5. Python中__init__.py文件的作用详解

    转自http://www.jb51.net/article/92863.htm Python中__init__.py文件的作用详解 http://www.jb51.net/article/86580. ...

  6. jsp九大内置对象和其作用详解

    jsp九大内置对象和其作用详解 JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.p ...

  7. [转载]java中import作用详解

    [转载]java中import作用详解 来源: https://blog.csdn.net/qq_25665807/article/details/74747868 这篇博客讲的真的很清楚,这个作者很 ...

  8. (转)面向对象(深入)|python描述器详解

    原文:https://zhuanlan.zhihu.com/p/32764345 https://www.cnblogs.com/aademeng/articles/7262645.html----- ...

  9. C++中头文件与源文件的作用详解

    一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 ...

随机推荐

  1. Hiho coder 1236 2015 北京网络赛 Score

    五维偏序..一开始被吓到了,后来知道了一种BITSET分块的方法,感觉非常不错. 呆马: #include <iostream> #include <cstdio> #incl ...

  2. Solr5 DataImport 处理1对多关系

    “问题” 和“派发处理” 是2个对象. 每个问题可以被派发N次, 最后结束问题. 实际查询中数据量可能很大,同时即可以从问题查派发部门, 也可以从派发情况查询问题(如本部门处理的问题) 使用的技巧就是 ...

  3. spring " expected single matching bean but found 2" 问题一例。

    初入java,使用spring时遇到一个问题,左边是一个接口和实现.右边是service和实现. @Service@Transactional(rollbackFor = Exception.clas ...

  4. maven国内镜像(maven下载慢的解决方法)

    Maven是当前流行的项目管理工具,但官方的库在国外经常连不上,连上也下载速度很慢.国内oschina的maven服务器很早之前就关了.今天发现阿里云的一个中央仓库,亲测可用. <mirror& ...

  5. python字符串方法的简单使用

    学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询. (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写.使用如下: >& ...

  6. 【转】解决Delphi WebBrowser 无法调用当前浏览器的版本

    procedure TregedtIE.FormCreate(Sender: TObject);   begin     WriteAppNameToReg;     WebBrowser1.Navi ...

  7. laravel框架总结(十二) -- 关联关系

    这里我们users表对应的模型类名是users,大家特意注意下和user取名的不同 1.一对一关系 1>表A和表B的记录一一对应,比如一个用户对应一个社交账号 数据表的设计如下:   2> ...

  8. highcharts php请求mysql返回json数据作为数据源进行制图

    直接上代码 [官方文档请参见http://www.highcharts.com/docs/working-with-data/getting-data-across-domains-jsonp] [实 ...

  9. mysql GROUP_CONCAT+ GROUP BY + substring_index获取分组的前几名

    mysql方法来源于:http://www.cnblogs.com/jjcc/p/5896588.html ###在网上看到一篇,非常赞的方法### 比如说要获取班级的前3名,mysql就可以用GRO ...

  10. 「 JavaScript 篇 」

    一.JavaScript 里有哪些数据类型,解释清楚 null 和 undefined,解释清楚原始数据类型和引用数据类型.比如讲一下 1 和 Number(1)的区别js中有5种数据类型:Undef ...