面向对象编程实例

简介: <p>    <span style="font-size:18px">    </span><span style="font-family:KaiTi_GB2312; font-size:18px">上一篇博客主要是在理论上介绍面向对象编程,下面通过一个计算器的实例来学习面向对象的好处。</span></p> <p><span style="font-family:KaiTi_GB2

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

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

       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),虽然每一种运算也是一种类,但是他们的最终结果是把几个数的运算结果算出来。

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

 


       

相关文章
|
传感器 监控 物联网
PoE 交换机:为现代网络供电
【4月更文挑战第21天】
558 0
|
4月前
|
运维 监控 数据可视化
基于 UptimeRobot 的开源站点监控面板——快速上手与部署指南
基于 UptimeRobot API 的站点监控面板,采用 PHP + Material Design 构建,支持 HTTP、Ping、TCP 等多种监控方式,具备多站点管理、数据可视化图表、响应式设计等功能。项目提供 Vercel 一键部署与手动部署两种方式,操作简便,适合快速集成到生产环境。开源地址:https://github.com/miloce/uptime-monitor,欢迎 Star 和反馈!
115 22
基于 UptimeRobot 的开源站点监控面板——快速上手与部署指南
|
11月前
|
JavaScript
VUE学习二:事件监听(v-on)、条件判断(v-if/v-else-if/v-else)、循环遍历(v-for)
这篇文章是关于Vue.js的学习指南,涵盖了事件监听、条件判断、循环遍历、数组方法响应性、案例分析以及高阶函数的使用。
178 2
VUE学习二:事件监听(v-on)、条件判断(v-if/v-else-if/v-else)、循环遍历(v-for)
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
232 2
|
10月前
|
机器学习/深度学习 人工智能 移动开发
Swift语言作为苹果公司推出的现代编程语言
Swift语言作为苹果公司推出的现代编程语言
194 8
|
11月前
|
缓存 JavaScript API
Vue 3的全新Reactivity API:解锁响应式编程的力量
【10月更文挑战第9天】Vue 3的全新Reactivity API:解锁响应式编程的力量
140 3
|
芯片 SoC 内存技术
全志H713红外IR遥控配置方法
这篇文章详细介绍了全志H713芯片平台配置红外遥控器的方法,包括获取遥控器规格、NEC协议的配置步骤、其他IR协议配置以及解决头码配置问题的方法。
616 5
全志H713红外IR遥控配置方法
|
Java
java 文件上传 :MultipartFile 类型转换为file类型
java 文件上传 :MultipartFile 类型转换为file类型
349 9
|
缓存 前端开发 Java
浅析JVM invokedynamic指令与Java Lambda语法
【8月更文挑战第27天】在Java的演进历程中,invokedynamic指令的引入和Lambda表达式的出现无疑是两大重要里程碑。它们不仅深刻改变了Java的开发模式和性能表现,还极大地推动了Java在函数式编程和动态语言支持方面的进步。本文将从技术角度浅析JVM中的invokedynamic指令及其与Java Lambda语法的紧密联系。
182 0
|
Android开发 索引
Android流布局实现筛选界面
Android流布局实现筛选界面
174 0