类是一种抽象的数据类型,但是其抽象的程度有可能会不同,而对象就是一个类的实例,例如,将花设计为一个类,天堂鸟和矢车菊就可以各为一个对象,从这里我们可以看出来,天堂鸟和矢车菊有很多共同点,她们都在某个地方生存,都会开花结果,对于这样相似的对象就可以将其抽象出一个数据类型,此处抽象为花,这样,只要将花这个数据类型编写好,程序中就可以方便地创建天堂鸟和矢车菊这样的对象,在代码需要更改时,只需要对花的类型进行修改即可。

以上,我们可以看出来,类与对象的区别,类是具有相同或相似结构、操作和约束规则的对象组成的集合,而对象是某一类的具体实例,每一个类都是具有某些共同特征的对象的抽象。类的面向对象具有封装、继承、多态的特性,接下来我们对这三种特性进行详细阐述,首先-封装。

封装其实就是信息隐藏,隐藏一个对象的本质,让用户不再注意那些细节.提供一些向外的接口供别人使用。就像电脑的内部已经被封起来,我们不需要知道它的内部是由哪些零件组成、如何工作。我们只需要知道用键盘,鼠标等设备来进行相应操作可以了。那么封装有哪些优点?她的实现方法以及目的又是怎样的呢?

接下来,举个例子,自定义一个MyClass类,该类用来封装加数和被加数属性,然后自定义一个Add方法,该方法用来返回该类中两个int属性的和,Program主程序类中,实例化自定义类的对象,并分别为MyClass类中的两个属性赋值,最后调用MyClass类中的自定义方法Add返回两个属性的和,相关代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class myclass            //自定义类,封装加数和被加数属性
    {
        private int x = 0;  //定义int型变量,作为加数
        private int y = 0;  //定义int型变量,作为被加数
        ///<summary>
        ///加数
        ///</summary>
        public int X
        {
            get
            {
                return x;
            }
            set
            {
                x  = value;
            }
        }
        public int Y //被加数
        {
            get
            {
                return y;
            }
            set
            {
                y = value;
            }
        }
        public int add ()//求和
        {
            return X + Y;
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            myclass myclass = new myclass();          //实例化myclass的对象
            myclass.X = 3;                           //为myclass类中的属性赋值
            myclass.Y = 5;                          //为myclass类中的属性赋值
            Console.WriteLine(myclass.add());       //调用myclass类中的add方法求和
            Console.ReadLine();
        }
    }
}

运行效果如下:

再者,继承-指一个对象直接使用另一个对象的属性和方法,任何类都可以从另一个类继承,这就是说,这个类拥有她继承的类的所有成员,在面对想编程中,被继承的类称为父类或基类,C#中提供了类的继承机制,但只支持但继承,而不支持多重继承,即在C#中一次只允许继承一个类,不能同时继承多个类。下面我们来举一个例子,来看一下继承是如何在代码中得到实现的。

创建一个控制台应用程序,其中自定义一个MyClass1类,然后自定义一个MyClass2类,该类继承于MyClass1类,这是MyClass2类就拥有MyClass1类中的所有公有成员,并且可以扩展其成员。Program主程序中,可以通过MyClass类的对象调用MyClass。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class myclass1                     //自定义类
    {
        private int x = 0;            //定义int型变量,作为加数
        private int y = 0;           //定义int型变量,作为被加数
        public int X
        {
            get
            {
                return x;
            }
            set
            {
                x = value;
            }
        }
        public int Y //被加数
        {
            get
            {
                return y;
            }
            set
            {
                y = value;
            }
        }
        public int add1()//求和
        {
            return X + Y;
        }
    }
    class myclass2:myclass1     //自定义类,该类继承自myclass1
    {
        private int z=0;        //定义int型变量,作为第二个被加数
        public int Z            //被加数
        {
            get
            {
                return z;
            }
            set
            {
                z=value ;
            }
        }
        public int Add2()                    //求和
        {
            return X + Y + Z;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            myclass1 myclass1=new myclass1 ();         //实例化myclass1的对象
            myclass2 myclass2=new myclass2 ();         //实例化myclass2的对象
            myclass1.X=3;                              //为myclass1类中的属性赋值
            myclass1.Y=5;                              //为myclass1类中的属性赋值
            myclass2 .X=3;                             //使用myclass2类对象调用基类中的属性并赋值
            myclass2 .Y=5;                             //使用myclass2类对象调用基类中的属性并赋值
            myclass2 .Z =7;                            //为myclass2类中的属性赋值
            Console.WriteLine (myclass1.add1());       //调用myclass1类中的add1方法求和
            Console.WriteLine (myclass2.add1());       //使用myclass类对象调用基类中的方法
            Console.WriteLine (myclass2.Add2 ());       //调用myclass类中的add2方法求和
        }
    }
}

运行效果如下:

最后,我们来看一下多态,多态是指类可以有多种形态,通过修改可以形成多个实现方法,当子类从父类继承时,她会获得父类的所有方法、字段、属性和事件。若要更改父类的数据和行为,通常有两种选择,可以创建新的成员替换父级成员,或者可以重写虚拟的父级成员。

在派生于同一个类的不同对象上执行任务时,多态是一种极为有效的技巧,使用的代码最少,可以把一组对象放到一个数组中然后调用她们的方法,在这种情况下多态的作用就体现出来了,这些对象不必是相同类型的对象,当然如果他们都继承自某个类,可以把这些子类(派生类)都放到一个数组中,如果这些对象都有同名方法,就可以调用每个对象的同名方法,在C#中,类的多态性是通过在子类(派生类)中重载基类的虚方法或函数成员来实现。

现在,我们来举个例子,看看多态是如何在代码中体现她的作用,首先创建一个控制台应用程序,其中自定义一个MyClass1类,该类中定义了一个虚方法Add,用来计算两个整数的和,然后自定义一个MyClass2类,该类继承与MyClass1类,在MyClass2类中重写MyClass1类中的虚方法。Program主程序类中,首先实例化子类MyClass2的一个对象,然后使用该对象实例化基类MyClass1的一个对象,这时,使用实例化的这两个对象都可以调用子类MyClass2中的重写方法,程序代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class   MyClass1 //自定义类
    {
        private int x = 0;//定义int型变量,作为加数
        private int y = 0;//定义int型变量,作为被加数
        public int X //加数
        {
            get
            { return x; }
            set
            { x = value; }
       }
        public int Y  //被加数
        {
            get
            {
                return y;
            }
            set
            {
                y = value;
            }
        }
        public virtual int Add()//定义一个virtual类型的方法,以便在子类(派生类)中重写该方法,求和
        {
            return X + Y;
        }
    }
    class MyClass2: MyClass1 //自定义类,该类继承自myclass1
    {
        public override int Add() //重写基类中的虚方法
        {
            int x = 5;
            int y = 7;
            return x + y;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass2 myclass2 =new MyClass2 ();//实例化myclass2的对象
            //使用子类(派生类)myclass2的对象实例化基类myclass1的对象
            MyClass1 myclass1 = (MyClass1)myclass2;
            myclass1.X = 3;//为myclass1类中的属性赋值
            myclass2.Y = 5;//为myclass1类中的属性赋值
            Console.WriteLine(myclass2.Add ());//调用子类(派生类)中的方法
            Console.WriteLine(myclass1.Add());//同样调用子类(派生类)中的方法
        }
    }
}

运行效果如下:

通过上述,我们知道封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性的正确调用,C#之旅,未完待续......

C#之面向对象的特性的更多相关文章

  1. [.net 面向对象编程基础] (11) 面向对象三大特性——封装

    [.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...

  2. [.net 面向对象编程基础] (12) 面向对象三大特性——继承

    [.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...

  3. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  4. 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍

    面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...

  5. Object Pascal 面向对象的特性

    2 面向对象的特性 在软件系统开发过程中,结构分析技术和结构设计技术具有很多优点,但同时也存在着许多难以克服的缺点.因为结构分析技术和结构设计技术是围绕着实现处理功能来构造系统的,而在系统维护和软件升 ...

  6. C++面向对象三大特性

    面向对象三大特性 继承 public protected private public继承 public protected 不可见 private继承 private private 不可见 pro ...

  7. J2SE基础:4.面向对象的特性一

    面向对象的特性 封装 继承多态 封装: 定义: 通过对象的封装,实现了模块化和信息隐藏. 通过对类的成员施以一定的訪问权限,实现了类中成员 的信息隐藏 注意点: 对象自已该做的一些事情与方法不能交与其 ...

  8. TypeScript 学习四 面向对象的特性,泛型,接口,模块,类型定义文件*.d.ts

    1,面向对象的特性一:类,继承,见上一篇博客: 2,面向对象的特性二: 泛型(generic):参数化的类型,一般用来限制集合的内容:指定只能放某个类型的元素 如下图中的尖括号中的Person,就代表 ...

  9. JAVA基础——面向对象三大特性:封装、继承、多态

    JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...

  10. day20面向对象三大特性 , 类嵌套

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.简述面向对象三大特性并用代码表示."""封装:class Account: ...

随机推荐

  1. Touch 方法&属性 映射工具

    Touch 方法&属性 映射工具(0.5 版本) 标签 : github 线上后门与接口调试: 原先需要测试一个接口(如Dubbo.DAO), 或为线上留后门, 需要写大量的Web层(Api. ...

  2. [django] 利用多线程增加异步任务

    看到django异步大家的反应应该是celery这种消息队列组件,现在用的最多的最推荐的也是这种方式.然而我这需求就是请求来了,执行一个小程序,但是又不能确定这个小程序啥时候执行完,响应又要及时,丢给 ...

  3. RDD:基于内存的集群计算容错抽象

    转载自:http://shiyanjun.cn/archives/744.html 摘要 本文提出了分布式内存抽象的概念--弹性分布式数据集(RDD,Resilient Distributed Dat ...

  4. API创建员工

    DECLARE lc_employee_number PER_ALL_PEOPLE_F.EMPLOYEE_NUMBER%TYPE := 'PRAJ_01'; ln_person_id PER_ALL_ ...

  5. UNIX网络编程——客户/服务器程序设计示范(三)

    TCP预先派生子进程服务器程序,accept无上锁保护 我们的第一个"增强"型服务器程序使用称为预先派生子进程的技术.使用该技术的服务器不像传统意义的并发服务器那样为每个客户现场派 ...

  6. Handler,MessageQueue Loop 和Message的原理解析

    先介绍和handler一起工作的几个组件 Handler的方法介绍 代码示例 package liu.peng.weather; import java.util.Timer; import java ...

  7. Swift中实现Observable机制

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/51917539 ...

  8. 再谈机器学习中的归一化方法(Normalization Method)

    机器学习.数据挖掘工作中,数据前期准备.数据预处理过程.特征提取等几个步骤几乎要花费数据工程师一半的工作时间.同时,数据预处理的效果也直接影响了后续模型能否有效的工作.然而,目前的大部分学术研究主要集 ...

  9. 关于android app签名文件获取sha1和MD值

    最近在做百度地图的嵌入,因为从同事接手的android app,所以第一次接触android的签名. 总的来说签名还比较简单,我用的是eclipse ADT自带的签名工具来做的签名,方法如下: 选择项 ...

  10. A*寻路算法入门(五)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...