浅谈面向对象特征

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

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

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

时间: 2024-10-29 19:06:18

浅谈面向对象特征的相关文章

在Objective-C中浅谈面向对象

接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java.每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点.写篇博文总结一下OC中的面向对象.刚接触OC,用OC中的便利初始化方法和便利构造器有点蹩脚,不过还可以在接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC中面向对象的特点.在用到便利构造器的时候,如果之前学习过设计模式的话会好理解一些. 在下面的代码

浅谈面向对象三大编程的特征

(一)封装: 属性property:属性是类.结构和接口的命名成员.它们提供了通过访问器accessor读.写或计算私有字段值的灵活机制. 属性是这样的成员:它们提供灵活的机制来读取编写或计算私有字段的值,可以像公共数据成员一样使用属性,但实际上他们是被称为访问器的特殊方法.这使得数据在可被轻松访问的同时,仍能提供方法的安全性和灵活性. 属性机制使得私有成员被隐藏,实现了封装的效果,良好的封装可以减少耦合,淡化类与类之间的紧密度依赖关系. (二)继承: 继承符号: “:”实现继承操作,建立Is-

浅谈面向对象

面向对象:顾名思义就是站在对象的角度思考问题,我们把多个功能合理的放到不同对象里,强调的是具备某些功能的对象. 具备某种功能的实体,称为对象, 面向对象很符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性和可拓展性. 面向对象的三大特征:封装,继承,多态 封装:影响对象的属性和实现细节,仅提供一个对外的接口,保证数据的安全性和完整性: 继承:实现一个类的时候可以在另外一个类的基础上实现,当子类继承父类后,子类是一种特殊的父类,能直接或间接获得父类里的成员,易于程

day10 浅谈面向对象编程

面向对象编程:第一步找名词,名词是问题域中的. 第二步概括名词设计成类.某些名词可以浓缩包含到其它名词中,成为其属性. 第三步找动词,动词也是问题域中的.   第四步概括动词设计成方法.动作的产生往往是对象身上发生的,根据动词动作的产生归纳到所属对象. 第五步根据需求确立方法的参数和返回值.如果在调用的地方,不需要值的返回或者返回的值后面根本用不到,则使用void.反之,如果方法调用的地方需要返回值或者后面其它地方需要用到该方法的结果,则设置相应的返回类型.如果方法中要使用其它地方传进来的值数据

虚拟世界(代码)--浅谈面向对象编程感触

不知不觉已经来到北京一年了,接触编程也一年了,或许我已经不再是那个连HelloWord都要写了N遍都不理解的低级菜鸟了(因为现在是中级了!!~~依旧是菜鸟) 在之前从来没有接触过编程,也不知道什么面向对象编程,面向过程编程.我的代码人生就是从这面向对象编程开始的. 面向对象编程,接触了C#和Java两种编程语言,感触良多(说实话,我现在已经快记不得老师讲过的有哪些重点了).我根据自己所了解的谈谈这段时间的收获. 一.什么是面向对象编程? 最初,老师告诉我们C#和Java都是面向对象编程的语言.那

Java系列1 -- 浅谈面向对象

也许每一个计算机专业的人,在大学学习java的时候,老师开始时都会说这么一句话,"Java是一门面向对象的语言".那么面向对象到底是什么,他有什么好处,或者他比其他流行的语言C/C++他强在哪里呢?“面向对象”在我们实际编程中有什么作用呢? 在开始实际的java之旅前,我们再次老生长谈下.我就按我自己的理解结合我这两年左右的编程经验来简单的说一说.其实在java之前我是学习C和C++的,但是并没有实际拿C或者C++写过什么项目,所以,一开始我就是直接用java的,在第一年的时候,我对面

浅谈面向对象和继承

1.面向对象和面向过程的区别 面向过程:注重代码的过程 面向对象:注重代码的结果 2.面向对象三大特性 抽象   封装  继承  多态(JS不存在多态) 3.什么是一个构造函数 new 一个关键字函数  创建一个对象,该对象的的属性this指向window 函数里面指向这个对象 构造函数和普通函数的区别 : 1.前者的this的指向是实例化后的对象 后者的指向是指向window 2.普通函数返回值需要加return 构造函数不需要因为返回的是自己本身 为什么构造函数没有return却能够有返回值

浅谈——面向对象

面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象

浅谈面向对象开发原则:高内聚,低耦合

软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计,主要是看类的内聚性是否高,偶合度是否低. 每一个类完成特定的独立的功能,这个就是高内聚.耦合就是类之间的互相调用关系,如果耦合很强,互相牵扯调用很多,那么会牵一发而动全身,不利于维护和扩展. 类之间的设置应该要低耦合,但是每个类应该要高内聚.耦合是类之间相互依赖的尺度.如果每个对象都有引用其它所有的对象,那么就有高耦合,这是不合乎要求的