C#面向对象特征的具体实现及作用详解

众所周知,面向对象编程的特点为:封装、继承、多态。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.总结

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

(0)

相关推荐

  • C#实现把txt文本数据快速读取到excel中

    今天预实现一功能,将txt中的数据转到excel表中,做为matlab的数据源.搜集一些c#操作excel的程序.步骤如下: 下载一个Microsoft.Office.Interop.Excel.dll   在项目中引用. 编写代码如下: string path = "c://date//xyu.txt"; StreamReader sr = new StreamReader(path); string strLine = sr.ReadLine(); int rowNum = 1;

  • C#自动判断Excel版本使用不同的连接字符串

    用OLEDB通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的. /// <summary> /// 把数据从Excel装载到DataTable /// </summary> /// <param name="pathName">带路径的Excel文件名</param> /// <param name="sheetName

  • C#开发教程之利用特性自定义数据导出到Excel

    网上C#导出Excel的方法有很多.但用来用去感觉不够自动化.于是花了点时间,利用特性做了个比较通用的导出方法.只需要根据实体类,自动导出想要的数据 1.在NuGet上安装Aspose.Cells或者用微软自带类库也可以 2.需要导出的数据的实例类: using System.ComponentModel; using System.Reflection; using System.Runtime.Serialization; public class OrderReport { [Displa

  • c#读取excel方法实例分析

    本文实例讲述了c#读取excel方法.分享给大家供大家参考.具体分析如下: Provider根据实际EXCEL的版本来设置,推荐使用ACE接口来读取.需要Access database Engine. 注意修改注册表以下两项的值为0.否则导入EXCEL当单元格内字符长度超过255会发生截断现象!!! HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\AccessConnectivity Engine\Engines\Excel\TypeGuess

  • C#自定义导出数据到Excel的类实例

    本文实例讲述了C#自定义导出数据到Excel的类.分享给大家供大家参考.具体如下: C#自定义Excel操作类,可以用于将DataTable导出到Excel文件,从Excel文件读取数据. using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; using System.Web; using System.Web.UI; using System.We

  • C#实现将DataTable内容输出到Excel表格的方法

    本文实例讲述了C#实现将DataTable内容输出到Excel表格的方法.分享给大家供大家参考.具体如下: 1.关于本文 本文描述了一个函数(SaveToExcel),该函数可以将DataTable数据内的数据输出到Excel表格中 2.相关说明 1)本文中使用这个函数将一个DataTable中的内容输出到路径名为addr的目录下: 复制代码 代码如下: public void SaveToExcel(string addr, System.Data.DataTable dt) 2)这个函数需要

  • 在asp.net(C#)中采用自定义标签和XML、XSL显示数据

    标签定义 复制代码 代码如下: public class Encoding { public string Encode(string cSource) { return System.Web.HttpUtility.HtmlEncode(cSource); } } public class EmList : Label { public override bool EnableViewState { get{ return false;} } public string XslFile{get

  • C#面向对象特征的具体实现及作用详解

    众所周知,面向对象编程的特点为:封装.继承.多态.C#是一门完全面向对象的语言,由于比Java推出的时间还要晚,所以对面向对象的思想的体现比Java还要完美,那么在C#中如何体现封装.继承和多态呢?下面举例并进行说明. 1.封装 封装的好处有以下几点: ①数据不外泄,可以做到一定的保护 ②类的使用者不用考虑具体的数据运算,方便 ③程序结构性强,层次清晰,便于维护 对相关的字段.方法进行封装固然对面向对象编程起到不可缺少的重要作用,但并不代表不可以访问类或者说具体的实例化对象中的内容,而且为使用者

  • Java语言面向对象编程思想之类与对象实例详解

    在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧. 首先我们来简单的阐述面向对象的思想. 面向对象: 官方的语言很抽象,我们把官方的解释和定义抛开.想想,自己有什么,对!!我们自己有手脚眼口鼻等一系列的器官.来把自己所具有的器官就可以看作我们的属性,自己是不是可以喜怒哀乐和嬉笑怒骂,这些是不是我们的行为,那么自己的具有的属性加自己有的行为就称为一个对象. 注意!!我们自己,一个个体是一个对象,因为,你是你,我是我,我们虽然有相同的,但

  • Java OOP三大特征之封装继承与多态详解

    目录 封装 继承 多态 OOP语言的三大特征即:面向对象的三个比较重要的思想 封装 官话:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口进行交互 通俗讲,不让类外看到实现的细节,通过技术手段对这些细节包装一个外壳,同时提供几个公开的接口,让你进行交互即可(例如:手机,内部的具体零件,不会让你观察到,使用者只能看到外壳,通过外壳的显示屏,充电口进行交互)简而言之——套壳屏蔽细节 实际上通过private来实现 例如: 继承 面向对象的思想中提出了继承的概念,专门用来进

  • Go interface接口声明实现及作用详解

    目录 什么是接口 接口的定义与作用 接口的声明和实现 接口的声明 接口的实现 接口类型断言 空接口 接口实际用途 通过接口实现面向对象多态特性 通过接口实现一个简单的 IoC (Inversion of Control) 什么是接口 接口是一种定义规范,规定了对象应该具有哪些方法,但并不指定这些方法的具体实现.在 Go 语言中,接口是由一组方法签名(方法名.参数类型.返回值类型)定义的.任何实现了这组方法的类型都可以被认为是实现了这个接口. 这种方式使得接口能够描述任意类型的行为,而不用关心其实

  • Mysql中explain作用详解

    一.MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构.用于提高查找效率,可以比作字典.可以简单理解为排好序的快速查找的数据结构. 索引的作用:便于查询和排序(所以添加索引会影响where 语句与 order by 排序语句). 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这样就可以在这些数据结构上实现高级查找算法.这些数据结构就是索引. 索引本身也很大,不可能全部存储在内存中,所以索引往往以索引文件的形式存储在磁盘上. 我们

  • bootstrap中的 form表单属性role="form"的作用详解

    html 里面的 role 本质上是增强语义性,当现有的HTML标签不能充分表达语义性的时候,就可以借助role来说明.通常这种情况出现在一些自定义的组件上,这样可增强组件的可访问性.可用性和可交互性. role的作用是描述一个非标准的tag的实际作用.比如用div做button,那么设置div 的 role="button",辅助工具就可以认出这实际上是个button 比如, <div role="checkbox" aria-checked="c

  • JavaScript中闭包的写法和作用详解

    1.什么是闭包 闭包是有权访问另一个函数作用域的变量的函数. 简单的说,Javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内.而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数和声明的其他内部函数.当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包. 2.变量的作用域 要理解闭包,首先要理解变量的作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变

  • PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )

    PHP中有eAccelerator.memcached.xcache.APC 4个加速.缓存扩展,下面给大家介绍下其区别,一起看看吧! 折腾VPS的朋友,在安装好LNMP等Web运行环境后都会选择一些缓存扩展安装以提高PHP运行速度,常被人介绍的有 eAccelerator.memcached.xcache.Alternative PHP Cache这几个缓存扩展,它们之间有什么区别?分别的作用又是什么?我们如何选择?这是本文给于大家的答案. 1.eAccelerator eAccelerato

  • ssm框架下web项目,web.xml配置文件的作用(详解)

    1. web.xml中配置了CharacterEncodingFilter,配置这个是拦截所有的资源并设置好编号格式. encoding设置成utf-8就相当于request.setCharacterEncoding("UTF-8"); foreEncoding设置成true就相当于response.setCharacterEncoding("UTF-8"); <filter> <filter-name>CharacterEncodingFi

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

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件. 通常__init__.py 文件为空,但是我们还可以为它增加其他的功能.我们在导入一个包时,实际上是导入了它的__init__.py文件.这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入. # package # __init__.py import re import urllib import sys impo

随机推荐