抽象方法实现计算器

摘要:
您需要修改交换机中的代码。设置1StaticavoidMain(string[]args)2{3while(true)4{5Console.Write(“请输入第一个数字:6intn1=Convert.ToInt32(Console.ReadLine());78Console.Write(”请输入运算符:

前面我们用面向对象的思想简单的实现了计算器。见http://www.cnblogs.com/wesley168/p/6226747.html。其实这里还是有其他问题的。

比如:现在我要除了要实现加减乘除外,还要添加其他运算,就需要修改switch中的代码。这违背了开闭原则(对修改关闭,对扩展开放)。

我们每次操作计算器的时候,都会输入两个数字,选择一个运算符,这是反复出现的。所以我们把输入的两个数字,运算符封装到一个类中,该类只实现一种运算。

由于每个类都要有两个数字,并且有个计算方法,但是这个方法在使用前并不知道里面是如何实现。所以我们把这个类设计成抽象类,里面的计算方法设计成抽象方法。代码如下:

抽象方法实现计算器第1张抽象方法实现计算器第2张
 1  public abstract class Calc
 2     {
 3         public int Number1 { get; set; }
 4 
 5         public int Number2 { get; set; }
 6         public Calc(int n1,int n2)
 7         {
 8             this.Number1 = n1;
 9             this.Number2 = n2;
10         }
11 
12         public abstract double Calculate();
13     }
View Code

控制台中的代码如下:

抽象方法实现计算器第3张抽象方法实现计算器第4张
 1 static void Main(string[] args)
 2         {
 3             while (true)
 4             {
 5                 Console.Write("请输入第一个数字: ");
 6                 int n1 = Convert.ToInt32(Console.ReadLine());
 7 
 8                 Console.Write("请输入运算符: ");
 9                 string sign = Console.ReadLine();
10 
11                 Console.Write("请输入第二个数字:");
12                 int n2 = Convert.ToInt32(Console.ReadLine());
13 
14                 Calc c = GetCalcResult(n1, sign, n2);
15 
16                 Console.WriteLine("结果是:{0}", c.Calculate());
17 
18             }
19 
20             //Console.ReadKey();
21         }
View Code

这里进一步把switch中的代码封装成了一个简单工厂的核心方法。如果需要添加运算操作,可以直接添加每个运算对应的类,如:

加法:

抽象方法实现计算器第5张抽象方法实现计算器第6张
 1 public class Add : Calc
 2     {
 3         public Add(int n1, int n2) : base(n1, n2)
 4         {
 5         }
 6 
 7         public override double Calculate()
 8         {
 9             return this.Number1 + this.Number2;
10         }
11     }
View Code

减法:

抽象方法实现计算器第7张抽象方法实现计算器第8张
 1 public class Sub : Calc
 2     {
 3         public Sub(int n1, int n2) : base(n1, n2)
 4         {
 5         }
 6 
 7         public override double Calculate()
 8         {
 9             return this.Number1 - this.Number2;
10         }
11     }
View Code

乘法:

抽象方法实现计算器第9张抽象方法实现计算器第10张
 1 public class Mul : Calc
 2     {
 3         public Mul(int n1, int n2) : base(n1, n2)
 4         {
 5         }
 6 
 7         public override double Calculate()
 8         {
 9             return this.Number1 * this.Number2;
10         }
11     }
View Code

除法:

抽象方法实现计算器第11张抽象方法实现计算器第12张
 1 public class Div : Calc
 2     {
 3         public Div(int n1, int n2) : base(n1, n2)
 4         {
 5         }
 6 
 7         public override double Calculate()
 8         {
 9             throw new NotImplementedException();
10         }
11     }
View Code

可能有人会问了,如果再添加新的运算符,还是需要更改switch中的方法。这里可以使用反射进一步优化。具体后面会进一步讲解。

免责声明:文章转载自《抽象方法实现计算器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇LeapMotion(1):环境配置、简单测试、理解对象一起谈.NET技术,Visual Studio对程序集签名时一个很不好用的地方 狼人:下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用FastReport的BarCode2D控件生成含中文的PDF417条形码

解决方法:设定CodePage为936 FastReport用户手册中关于CodePage的说明: CodePage   This property is specific to the PDF417 and Datamatrix barcode. It determines the code page which is used to convert...

Java 9 尝鲜之JShell交互式编程环境

JShell——Java 9 的交互式编程环境 本文要求读者有基本的 Java 知识。 Tips Java 9 的代码由于提供了新特性,所以有些代码并不支持向后兼容。也就是说,用 Java 9 写的代码,有可能在 Java 8 或更早版本的 JDK 上不能运行。 1. 在操作系统上安装开发所需要的软件 首先,你需要下载JDK 9 (Java Develo...

Python并发编程协程(Coroutine)之Gevent

Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程。 在linux系统中,线程就是轻量级的进程,而我们通常也把协程称为轻量级的线程即微线程。 进程和协程 下面对比一下进程和协...

vs2010(vs2012)好用的扩展插件介绍

  一直以来只使用番茄vs助手(https://www.wholetomato.com/downloads/default.asp)辅助写代码,也都忘了是谁介绍的,不过确实好用。 相比原始的vs,它提供了很多改进功能。例如,重命名变量,高亮宏与自定义类型,查找引用,智能代码提示等。   因为一直以来用着没有觉得不爽的地方,所以对于vs的其它插件都没做研究。...

C#位运算讲解与示例

今天在项目中遇到按位或组合权限串的问题: 首先每一个权限数都是2的N次方数 如:k1=2 ; //添加           k2=4 ; //删除           k3=8; //修改           ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了。 如:          purview = k2|k3; //...

学习如何高效率编写单片机代码,优化程序设计

1、 使用尽量小的数据类型 能用unsiged就不用signed;能用char就不用int;能不用floating就不用;能用位操作不用算数。 2、使用自加、自减指令 通常使用自加、自减指令和复合赋值表达式(如a-=1 及a+=1 等)都能够生成高质量的程序代码,编译器通常都能够生成inc 和dec 之类的指令,而使用a=a+1 或a=a-1 之类的指令,...