面向对象编程实例

上一篇博客主要是在理论上介绍面向对象编程,下面通过一个计算器的实例来学习面向对象的好处。

       按照面向对象的三大特征:

       1、封装

对事物的状态和行为的细节封装,这样就形成了一个可以重复使用的“零件”,这样就使得我们写的代码可复用,下面是计算器的代码展示,把计算器的业务逻辑与界面逻辑分开:

///业务逻辑——OPeration运算类
public class Operation
    {
        public static double GetResult(double numberA, double numberB, string operate)
        {
            double result = 0d;
            switch (operate)        ///给运算类(+、-、*、/)定义
            {
                case "+":
                    result = numberA + numberB;
                    break;
                case "-":
                    result = numberA - numberB;
                    break;
                case "*":
                    result = numberA * numberB;
                    break;
                case "/":
                    result = numberA / numberB;
                    break;
            }
            return result;
        }
    }
///界面逻辑——客户端代码 
static void Main (string[] args)
        {
            Operation oper;
            oper = OperationFactory.createOperate("+");
            oper.NumberA = 1;
            oper.NumberB = 2;
            double result = oper.GetResult();
            ///对界面进行设计定义
            try 
            {
                Console.Write("请输入数字A:");
                string strNumberA = Console.ReadLine();
                Console.Write("请选择运算符号(+、-、*、/):");
                string strOperate = Console.ReadLine();
                Console.Write("请输入数字B:");
                string strNumberB=Console.ReadLine();
                string strResult="";
                strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), strOperate));
                Console.WriteLine("结果是:" + strResult);
                Console.ReadLine();
            }
            catch (Exception ex)     ///错误信息提示
            {
                Console.WriteLine("您的输入有错:" + ex.Message);   
            }
            
        }

这样,我们就可以自由的修改类的内部,用户如果想写一个其他版的程序,既可以直接复用这个Operation运算类。

         2、继承

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)
                throw new Exception("除数不能为0.");
            result = NumberA / NumberB;
            return result;
        }
    }

加减乘除是运算方法类,运行时的代码大部分都相同,把相同的代码都放到父类运算类(OPeration)中,这样写代码的时候重复的部分就可以不用写,直接从父类中继承就行,而且如果不用继承,当你修改功能,就必须在所有重复的方法中修改,代码越多,出错的可能就越大。

        3、多态

我们建一个简单运算工厂,这个工厂的功能生产各种运算,加减乘除,平方根,立方根,自然对数,正弦余弦...

public class OperationFactory
    {
        public static Operation createOperate(string operate)
        {
            Operation oper = null;
            switch (operate )      ///定义新的运算
            {
                case "+":
                    oper = new OperationAdd();
                    break;
                case "-":
                    oper = new OperationSub();
                    break;
                case "*":
                    oper = new OperationMul();
                    break;
                case "/":
                    oper = new OperationDiv();
                    break;
            }
            return oper;
        }
    }

各种运算都是子类,他们都有一个共同的父类运算类(Operation),虽然每一种运算也是一种类,但是他们的最终结果是把几个数的运算结果算出来。

这样我们就实现了我们所写的程序可维护、可扩展、可复用、灵活性好的功能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【专业技术】反射技术探究

反射 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象...

3286
来自专栏领域驱动设计DDD实战进阶

05-TypeScript中的方法新功能(下)

再TypeScript中,方法还有一些新功能能够让我们更好的控制方法执行。 1.Generator方法: yield关键字用于控制方法在执行的时候暂停住,后续方...

2805
来自专栏大内老A

EnterLib PIAB又一个BUG?[续]——这是一个致命的BUG

在《EnterLib PIAB又一个BUG?》这篇文章中我们谈到:当我们通过应用DependencyAttribute特性定义需要自动注入的属性的时候,当这个属...

2419
来自专栏Python小屋

Python版归并排序算法(附Python程序__name__属性用法演示视频)

import random def mergeSort(seq, reverse=False): #把原列表分成两部分 mid = len(s...

3256
来自专栏大内老A

ASP.NET MVC Model元数据及其定制: Model元数据的定制

在《上篇》我们已经提到过了,Model元数据的定制是通过在作为Model的数据类型极其属性成员上应用相应的特性来实现,这些用于声明式元数据定义的特性大都定义在S...

3374
来自专栏草根专栏

设计模式学习(四): 1.简单工厂 (附C#实现)

New ? ? 这是一个典型的情况, 我们需要在运行时来实例化一些具体的类. 在需要修改或者扩展的时候我们就需要改这段代码. 一个程序中可能会多次出现类似的代码...

2976
来自专栏大内老A

深入探讨ASP.NET MVC的筛选器

在ActionInvoker对Action的执行过程中,除了通过利用ActionDescriptor对Action方法的执行,以及之前进行的Model绑定与验证...

2058
来自专栏大内老A

通过扩展改善ASP.NET MVC的验证机制[实现篇]

在《使用篇》中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离、多语言的支持和多验证规则的支持,我们现在来看看这样的验证解决方案最...

20710
来自专栏葡萄城控件技术团队

Top 15 不起眼却有大作用的 .NET功能集

目录 1. ObsoleteAttribute 2. 设置默认值属性: DefaultValueAttribute 3. DebuggerBrowsableAt...

22710
来自专栏大内老A

EnterLib PIAB又一个BUG?[续]——这是一个致命的BUG

在《EnterLib PIAB又一个BUG?》这篇文章中我们谈到:当我们通过应用DependencyAttribute特性定义需要自动注入的属性的时候,当这个属...

23410

扫码关注云+社区

领取腾讯云代金券