zoukankan      html  css  js  c++  java
  • C#面向对象的核心概念

    一、面向对象的核心概念

    (一)抽象——面向对象的根基

    讲到抽象,不得不涉及到现代科学技术的基础——数学。

    数学是一门抽象的科学,面对着纷繁复杂的世间万物,数学不理会各种事物的独特特性,而只抽取它们在数量上的特性,深刻揭示了“世间万物”在数量上表现出的共同规律,抽象正是数学的本质特征。

    数学的一个分支——离散数学是计算机科学的根基之一,因此,计算机科学从诞生之日起,就与数学有着密不可分的联系,抽象思维也是计算机科学的主要思维方法之一。

    在使用面向对象的方法设计一个软件系统时,首先就要区分出现实世界中的事物所属的类型,分析它们拥有哪些性质与功能,再将它们抽象为在计算机虚拟世界中才有意义的实体——类,在程序运行时,由类创建出对象,用对象之间的相互合作关系来模拟真实世界中事物的相互关联。

    在从真实世界到计算机虚拟世界的转换过程中,抽象起了关键的作用。

    (二)面向对象的三大基本特性

    1.封装

    封装的类=数据+对此数据所进行的操作(即算法)

    通俗的说,封装就是:包起外界不必需要知道的东西,只向外界展露可供展示的东西。

    2.继承

    真实世界中,事物之间有着一种派生关系,比如“食品”这一大类中包括“水果”这一子类,而“苹果”又包含在“水果”这一子类中。

    在计算机世界中,以面向对象的观点不仅将上述事物抽象为类,而且将事物之间的派生关系也一并模拟出来,这种关系称为“继承”。

    在面向对象软件系统中,继承除了模拟现实世界中事物关系这一作用,还是一个“重用已有代码而又不破坏已有代码”的方法。

    3.多态

    在代码中本应使用某一具体子类的地方使用较为抽象的基类对象,这种方法所带来的好处是多态的代码具有“变色龙”的特性,即在不同的条件下,同样代码可以完成不同的功能。

    二、类与对象

    (一)类是面向对象编程的基本单元。

    (二)字段即变量,方法即函数。

    函数分为变量函数(字段的保护),行为函数。

    实例方法:对象可以调用,类不能调用。

    方法的重载:1.同名2.参数类型不同或个数不同

    (三)传值与传址

    传值引用:整形变量,浮点型变量,结构体,日期时间(存储在栈空间)

    传址引用:字符串,数组,类。(存储在堆空间)

    f

    例题:小狗——类的传址引用

    class dog
        {
            public string name;
            public void bark()
            {
                Console.WriteLine("汪汪,我的名字叫"+name);
            }
        }
    
     static void Main(string[] args)
            {
                dog a = new dog();
                dog b = new dog();
    
                a.name = "旺财";
                b.name = "守家";
                a.bark();
                b.bark();
    
                //将a的引用地址复制给c,a和c将同时控制同一个对象;
                //c将对象属性改变后,a指向的也是一个改变后的对象。
                dog c = a;           
                c.name = "大黄";
                a.bark();
    
                //将b的引用地址复制给a和c,a、b、c、控制同一个对象;
                //a、b原来指向的对象没有地址指向它,无法被调用,称为垃圾。
                a = b;
                c = b;              
                a.bark();
                b.bark();
                c.bark();

    a

    例题:用oop解决泳池问题

    //创建圆的类
     class circle
        {
            public double r;
            public double getLength()
            {
                double l = 2 * 3.14 * r;
                return l;
            }
            public double getArea()
            {
                double s = 3.14 * r * r;
                return s;
            }
        }
    
     //求游泳池的周长和广场面积
            static void Main(string[] args)
            {
                circle small = new circle();
                circle big = new circle();
                Console.Write("请输入小圆半径");
                small.r=Convert.ToInt32(Console.ReadLine());
                Console.Write("请输入大圆半径");
                big.r = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("泳池周长:"+small.getLength());
                Console.WriteLine("广场面积:"+(big.getArea()-small.getArea()));
    
            }

    b

    例题:狗咬狗——方法的重载

    class dog
        {
            public string name;
            public int HP = 100;
            public void bark()
            {
                Console.WriteLine("汪汪,我的名字叫" + name);
            }
            public void bite(dog op)
            {
                Console.WriteLine(name + "开始攻击" + op.name);
                op.HP -= 10;
                Console.WriteLine(name + "的血量:" + HP + "
    " + op.name + "的血量:" + op.HP);
    
            }
    
        }
    
     class people
        {
            public string name;
            public void attackDog(dog op)
            {
                op.HP -= 10;
                Console.WriteLine(name+"开始打狗
    "+op.name+"的血量:"+op.HP);
            }
            public void attackDog(dog op, int blood)
            {
                op.HP -= blood;
                Console.WriteLine(name+"开始打狗
    "+op.name+"的血量:"+op.HP);
            }
        }
    
      static void Main(string[] args)
            {
                //狗咬狗
                dog a = new dog();
                dog b = new dog();
                a.name = "旺财";
                b.name = "守家";
                a.bite(b);
                b.bite(a);
                //人打狗,函数的重载
                people h = new people();
                h.name = "秋香";
                h.attackDog(a);
                h.attackDog(a,15);
            }

    c

    例题:opp的字段保护——学生信息

    class student
        {
            /*通过设置private,在本类之外无法直接操作该类的字段,
            必须通过调用该类的函数(称为变量函数)来访问,起到保护字段的作用*/
            public string name;
            private int height;
            private int weight;
            public void setHeight(int a)
            {
                if (a > 0 && a < 1000)
                {
                    height = a;
                }
                else
                {
                    Console.WriteLine("身高输入不正确");
                }
            }
    
            public int getHeight()
            {
                return height;
            }
    
            public void setWeight(int a)
            {
                if (a > 0 && a <= 1000)
                {
                    weight = a;
                }
                else
                {
                    Console.WriteLine("体重输入不正确");
                }
            }
    
            public int getWeight()
            {
                return weight;
            }
    
            public void speak()
            {
                Console.WriteLine("我叫"+name+";体重:"+weight+"千克。身高:"+height+"cm");
            }
        }
    
    
     static void Main(string[] args)
            {
                student a = new student();
                a.name = "王小明";
                a.setHeight(170);
                a.setWeight(80);
    
                a.speak();
            }

    d

  • 相关阅读:
    解决云服务器ECS,windows server 2012不能安装SQL Server 2012,不能安装.NET Fromework 3.5
    html5中checkbox的选中状态的设置与获取
    sql server 韩文查询匹配失败
    管理nuget程序包中搜索不到任何程序包
    ftp下出现“当前的安全设置不允许从该位置下载文件”提示
    windows server 2012 下IIS8.5关于“ 配置错误 不能在此路径中使用此配置节”的解决办法
    服务器升级后访问网站资源返回404
    centos7yum的更新与优化
    linux(centos7)命令提示符优化
    检查vmware虚拟软件服务是否开启?
  • 原文地址:https://www.cnblogs.com/wllhq/p/4266206.html
Copyright © 2011-2022 走看看