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

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

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

接下来,举个例子,自定义一个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. chrome官方完整安装包

    But did you know Google allows you to download the full standalone installer of Chrome from its offi ...

  2. Swift完成fizz buzz test

    看到一篇文章上说,很多貌似看过很多本编程书的童鞋连简单的fizz buzz测试都完不成. 不知道fizz buzz test为何物的,建议自行搜之. 测试要求是,编写满足以下条件的代码: Write ...

  3. Android样式(style)和主题(theme)

    样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字体颜色.字号.背景色等许多属性. 样式是在与指定布局的 XML 不同的 XML 资源中进行定义. Andro ...

  4. 探究java接口中的变量与方法

    关于变量 java接口里的变量都是默认 pubic static final的 为啥? public 接口得能被所有对象调用 static 这个变量是属于接口本身,而不是实现了接口的对象的 具体来说  ...

  5. Android Multimedia框架总结(五)多媒体基础概念

    转载请把头部出处链接和尾部二维码一起转载,本文出自: http://blog.csdn.net/hejjunlin/article/details/52431887 上篇中介绍了MediaPlayer ...

  6. EJB3+JBoss5+Myeclipse9创建HelloWorld实例

    本实例用到的工具 1. jboss5 (配置不做介绍,谷歌度娘都有) 2. MyEclipse 9 实例创建 1.EJB类创建 打开MyEclipse 9 中右上角如下选项  再新建一个EJB项目 新 ...

  7. 在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法!

    在Activity,Service,Window中监听Home键和返回键的一些思考,如何把事件传递出来的做法! 其实像按键的监听,我相信很多人都很熟练了,我肯定也不会说这些基础的东西,所以,前期,还是 ...

  8. SQL Server SA 最佳实践(也许不仅仅是翻译)

    老实说,本文主要部分是翻译的,并且由于英语水平的问题,我没有完全翻译,有些我觉得不重要的就跳过了,目前看来应该八九不离十,或者说不会影响最终效果,对于英语水平好的读者,可以自行查看原文.但这一年里面我 ...

  9. 【java多线程系列】java内存模型与指令重排序

    在多线程编程中,需要处理两个最核心的问题,线程之间如何通信及线程之间如何同步,线程之间通信指的是线程之间通过何种机制交换信息,同步指的是如何控制不同线程之间操作发生的相对顺序.很多读者可能会说这还不简 ...

  10. 【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)

    写在前面 在之前的基础篇中,我们讲到了在绘制点线时如何处理边缘的锯齿,也就是使用smoothstep函数.而模糊参数是一些定值,或者是跟屏幕分辨率相关的数值,例如分辨率宽度的5%等等.但这种方法其实是 ...