C#使用反射、多态实现的计算器

一、文件结构及使用到知识点

1、 文件由Program、Operator、OperatorFactory组成。

  • Program文件:主函数入口(初始化静态字典,输入流程,动态调用方法,输出结果。)
  • Operator文件:Operator抽象类,加减乘除具体实现。
  • OperatorFactory文件:工厂动态创建方法。

2、主要使用到的知识点有:反射、向上转型、多态

二、Program.cs代码

using System;
using System.Collections.Generic;
namespace CalculateDemo
{
    class Program
    {
        /// <summary>
        /// 记录方法的Dictionary
        /// </summary>
        static Dictionary<string, string> cfg = new Dictionary<string, string>();
        static void Main(string[] args)
        {
            Load();
            while(true)
            {
                Console.Write("请输入操作数1:");
                int x = int.Parse(Console.ReadLine());
                Console.Write("请输入操作数2:");
                int y = int.Parse(Console.ReadLine());
                Console.Write("请输入运算符:");
                string op = Console.ReadLine();
                Operator opr = OperatorFactory.Create(cfg[op]);
                opr.Left = x;
                opr.Right = y;
                int r = opr.Calc();
                Console.WriteLine($"{x}{op}{y}={r}");
            }
        }
        /// <summary>
        /// 初始化赋值
        /// </summary>
        static void Load()
        {
            cfg.Add("+", "CalculateDemo.AddOperator");
            cfg.Add("-","CalculateDemo.SubOperator");
            cfg.Add("*", "CalculateDemo.MulOperator");
            cfg.Add("/", "CalculateDemo.DivOperator");
        }
    }
}

三、Operator.cs代码

namespace CalculateDemo
{
    abstract class Operator
    {
        public int Left { get; set; }
        public int Right { get; set; }
        public abstract int Calc();
    }
        class AddOperator : Operator
    {
        public override int Calc()
        {
            return Left + Right;
        }
    }
    class SubOperator : Operator
    {
        public override int Calc()
        {
            return Left - Right;
        }
    }
    class MulOperator : Operator
    {
        public override int Calc()
        {
            return Left * Right;
        }
    }
    class DivOperrator : Operator
    {
        public override int Calc()
        {
            return Left / Right;
        }
    }
}

四、OperatorFactory.cs代码

using System;
using System.Reflection;

namespace CalculateDemo
{
    class OperatorFactory
    {
        /// <summary>
        /// 利用反射
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static Operator Create(string name)
        {
            Operator opr = null;
            Type cls = Type.GetType(name);
            //GetConstructor(),返回ConstructorInfo类型,用于取得该类的构造函数的信息
            ConstructorInfo ci = cls.GetConstructor(Type.EmptyTypes);
            //调用具有指定参数的实例反映的构造函数,为不常用的参数提供默认值
            opr = (Operator)ci.Invoke(null);
            return opr;
        }
    }
}

五、GitHub地址

项目地址,点击访问GitHub

猜你喜欢

转载自blog.csdn.net/qq_33391499/article/details/104726558