博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《程序员的第一年》---复习一下C#的【封装 多态 继承 -----简单计算器源码实例】...
阅读量:4598 次
发布时间:2019-06-09

本文共 4772 字,大约阅读时间需要 15 分钟。

一.封装

向对象程序设计中,一个非常重要的技术便是封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。这样做的好处在于可以使类内部的具体实现透明化,只要其他代码不依赖类内部的私房数据,你便可以安心修改这些代码。此外,这样做也是出于安全方面的考虑,如果代表网上支付卡密码的变量随便就可以被访问到,这样的系统谁还敢用呢?

访问修饰符:

Private:只有类本身能存取.

Protected:类和派生类可以存取.
Internal:只有同一个项目中的类可以存取.
Protected Internal:是Protected和Internal的结合. 
Public:完全存取.

实例代码

 

class Operation             //运算基类    {        private double _numberA = 0;        private double _numberB = 0;        public double NumberA        {            get { return _numberA; }            set { _numberA = value; }        }        public double NumberB        {            get { return _numberB; }            set { _numberB = value; }        }        public virtual double GetResult()       //定义虚方法        {            double result = 0;            return result;        }    }

 

上面 Operation类中字断与方法 就实现了一个封装。

二.多态

 

1、多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

编译时的多态性:

编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 
运行时的多态性:
运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。 
编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。

  2、实现多态:

    1. 接口多态性。
    2. 继承多态性。
    3. 通过抽象类实现的多态性。

3、override关键字:

重写父类中的virtual修饰的方法,实现多态。

实例代码如下:

重写方法,

三.继承

 

继承主要实现重用代码,节省开发时间。

1、C#中的继承符合下列规则:

    1. 继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。
    2. 派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
    3. 构造函数和析构函数不能被继承。除此之外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
    4. 派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
    5. 类可以定义虚文法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。

2、new关键字

如果父类中声明了一个没有friend修饰的protected或public方法,子类中也声明了同名的方法。则用new可以隐藏父类中的方法。(不建议使用)

3、base关键字

base 关键字用于从派生类中访问基类的成员:

    1. 调用基类上已被其他方法重写的方法。
    2. 指定创建派生类实例时应调用的基类构造函数

 

我把简单计算器的源码与类图放上,看不懂再讨论。

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 简单的计算器_封装_继承_多态_{    class Program    {        static void Main(string[] args)        {            Operation oper;            Console.WriteLine("请输入运算符:\r\n");            oper = OperationFactory.createOperation(Console.ReadLine());            Console.WriteLine("请输入第一个数:\r\n");            oper.NumberA = int.Parse(Console.ReadLine());            Console.WriteLine("请输入第二个数:\r\n");            oper.NumberB = int.Parse(Console.ReadLine());            double result = oper.GetResult();            Console.WriteLine("运算结果:\r\n");            Console.WriteLine(oper.NumberA.ToString() +"+"+ oper.NumberB.ToString() + "=" + result.ToString());            Console.ReadLine();        }    }    class Operation             //运算基类    {        private double _numberA = 0;        private double _numberB = 0;        public double NumberA        {            get { return _numberA; }            set { _numberA = value; }        }        public double NumberB        {            get { return _numberB; }            set { _numberB = value; }        }        public virtual double GetResult()       //定义虚方法        {            double result = 0;            return result;        }    }    class OperationAdd : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA + NumberB;            return result;        }    }    class OperationSub : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA - NumberB;            return result;        }    }    class OperationMul : Operation    {        public override double GetResult()        {            double result = 0;            result = NumberA * NumberB;            return result;        }    }    class OperationDiv : Operation    {        public override double GetResult()        {            double result = 0;            if (NumberB != 0)                result = NumberA / NumberB;            else                Console.WriteLine("除数不能为零!\n");            return result;        }    }    class OperationFactory      //运算对象生产工厂    {        public static Operation createOperation(string operation)        {            Operation oper = null;            switch(operation)            {                case "+":                    {                        oper = new OperationAdd();                        break;                    }                case "-":                    {                        oper = new OperationSub();                        break;                    }                case "*":                    {                        oper = new OperationMul();                        break;                    }                case "/":                    {                        oper = new OperationDiv();                        break;                    }            }            return oper;        }    }}

 

本文整理来源:

 

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/04/05/3000876.html

你可能感兴趣的文章
去除ActionBar的方法
查看>>
STM8S——Universal asynchronous receiver transmitter (UART)
查看>>
Flink - state管理
查看>>
Apache Kafka - KIP-42: Add Producer and Consumer Interceptors
查看>>
ArcGIS JS Demo
查看>>
webservice发布问题,部署iis后调用不成功
查看>>
Koch 分形,海岸线,雪花
查看>>
ubuntu系统下Python虚拟环境的安装和使用
查看>>
IOS7开发~新UI学起(二)
查看>>
软件过程度量和CMMI模型概述
查看>>
数据结构(DataStructure)与算法(Algorithm)、STL应用
查看>>
Linux与Windows xp操作系统启动过程
查看>>
linux运维、架构之路-Kubernetes1.13离线集群部署双向认证
查看>>
[Leetcode]Substring with Concatenation of All Words
查看>>
Gem install rmagick 报错问题~
查看>>
验证一个方法触发时机
查看>>
25句充满正能量的句子
查看>>
python学习手册笔记——27.更多实例
查看>>
Spring Cloud Alibaba 新版本发布:众多期待内容整合打包加入!
查看>>
Android Camera 使用小结
查看>>