首先在解决方案里新建一个类库,然后在解决方案里新建三个项目,WPF,WEB,WinForm,但是这三个项目都需要一个计算类进行计算,那么就在新建的类库Calculator里面放一个Calculat.cs类,以便于三个项目共用,调用的时候需要引用一下,下面会有图解。
在类库引用Calculat.cs:
引用后:
共用类Calculat.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace Calculator
7 {
8 public class Calculat
9 {
10 public abstract class Calculator //抽象类 Calculator
11 {
12 public abstract double Cal(double a, double b); //抽象方法Cal
13 }
14 public class Add : Calculator //派生类Add继承抽象类Calculator
15 {
16 public override double Cal(double a, double b)//并重写了抽象方法Cal
17 {
18 double result = 0;
19 result = a + b;
20 return result;
21 }
22 }
23 public class Sub : Calculator
24 {
25 public override double Cal(double a, double b)
26 {
27 double result = 0;
28 result = a - b;
29 return result;
30 }
31 }
32 public class Mul : Calculator
33 {
34 public override double Cal(double a, double b)
35 {
36 double result = 0;
37 result = a * b;
38 return result;
39 }
40 }
41 public class Div : Calculator
42 {
43 public override double Cal(double a, double b)
44 {
45 double result = 0;
46 result = a / b;
47 return result;
48 }
49 }
50 public class Context //上下文
51 {
52 private Calculator calculate = null;//实例化一个基类的引用对象
53 public Context(Calculator _cal)//_cal为派生类的一个对象
54 {
55 this.calculate = _cal; //把派生类的对象赋给基类的引用对象
56 }
57 public double Cal(double a, double b, String symbol)
58 {
59 return this.calculate.Cal(a, b);//返回计算结果
60 }
61 }
62 }
63 }
MainWindow.xaml.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows;
6 using System.Windows.Controls;
7 using System.Windows.Data;
8 using System.Windows.Documents;
9 using System.Windows.Input;
10 using System.Windows.Media;
11 using System.Windows.Media.Imaging;
12 using System.Windows.Navigation;
13 using System.Windows.Shapes;
14
15 namespace WPF
16 {
17 /// <summary>
18 /// MainWindow.xaml 的交互逻辑
19 /// </summary>
20 public partial class MainWindow : Window
21 {
22 public MainWindow()
23 {
24 InitializeComponent();
25 }
26 int Count=0;
27 int Right=0;
28 public static String AddSymbol = "+"; //加法
29 public static String SubSymbol = "-"; //减法
30 public static String MulSymbol = "*"; //乘法
31 public static String DivSymbol = "/"; //除法
32 private void textBox3_KeyDown(object sender, KeyEventArgs e)
33 {
34 double a = double.Parse(textBox1.Text); //用来存第一个数
35 string symbol = comboBox1.Text; //用来存运算符
36 double b = double.Parse(textBox2.Text); //用来存第二个数
37 Calculator.Calculat.Context contex = null; //上下文
38 if (symbol.Equals(AddSymbol)) //若为加号
39 {
40 contex = new Calculator.Calculat.Context(new Calculator.Calculat.Add()); //加法策略
41 }
42 else if (symbol.Equals(SubSymbol)) //如果减号
43 {
44 contex = new Calculator.Calculat.Context(new Calculator.Calculat.Sub()); //减法策略
45 }
46 else if (symbol.Equals(MulSymbol)) //若为乘号
47 {
48 contex = new Calculator.Calculat.Context(new Calculator.Calculat.Mul()); //乘法策略
49 }
50 else if (symbol.Equals(DivSymbol)) //若为除号
51 {
52 contex = new Calculator.Calculat.Context(new Calculator.Calculat.Div()); //除法策略
53 }
54 string answer = contex.Cal(a, b, symbol).ToString(); //用answer来存计算出来的答案,此时已经计算出a,b两个数的运算结果。
55 if (e.Key == Key.Enter) //回车操作
56 {
57 string result = textBox1.Text + comboBox1.Text + textBox2.Text;//把运算式子存在result里面
58 Count++; //出题总数加一
59 if (textBox3.Text == answer) //如果输入答案与计算出的answer相等
60 {
61 MessageBox.Show("回答正确!"); //弹出回答正确
62 listBox1.Items.Add(result + "=" + textBox3.Text.Trim() + "√");//并把运算式子存在listbox里
63 Right++; //答对题数加一
64 }
65 else //如果答错
66 {
67 MessageBox.Show("答题错误!"); //弹出答题错误
68 listBox1.Items.Add(result + "=" + textBox3.Text.Trim() + "×");//同样把运算式子放在listbox
69 }
70 label2.Content = "正确率:" + Convert.ToString(Right * 1.0 / Count * 100).PadRight(5, ' ').Substring(0, 5) + "%";//统计正确率
71 textBox1.Clear();//把文本框清空,进行下一次出题
72 textBox2.Clear();
73 textBox3.Clear();
74 }
75 }
76 }
77 }
出题答题:
统计:
感觉WPF的界面会比WEB、WinForm要美观一些。