当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

谈谈C#中的接口Interface的常用套路

Jorge2年前 (2022-05-09)C#/.net框架744

 

带大家回顾一下面向对象编程和设计模式的精髓概念。


面向对向程序的三大特征:

封装,隐藏内部实现

继承,复用现有代码

多态,改写对象行为


设计模式的核心思想:

(1)设计模式最根本的意图是适应需求的变化。

(2)编码应采用高内聚低耦合设计思想

(3)针对接口编程,而不要针对实现编程

(4)优先使用聚合,而不是继承

(5)坚持开闭原则(OCP)

C#
注:

内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事,它描述的是模块内的功能联系;
耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、
进入或访问一个模块的点以及通过接口的数据。


开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段。
开闭原则中“开”,是指对于组件功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。


按上面的思想,勇哥编了一段小程序。

在这个小例子里面用到了:

  • 封装、继承、多态

  • 设计模式思想(1)、(2)、(3)、(5)


C#
   /// <summary>
    /// 计算方法一的实现: 不打折
    /// </summary>
    public class m1 : ICal    {
        public T Add<T>(T x, T y)
        {
            dynamic res=(float.Parse(x.ToString()) + float.Parse(y.ToString()));
            return (T)res;
        }

    }

    /// <summary>
    /// 计算方法二的实现:半价
    /// </summary>
    public class m2 : ICal    {
        public T Add<T>(T x, T y)
        {
            dynamic res = (float.Parse(x.ToString()) + float.Parse(y.ToString()))*0.5;
            return (T)res;
        }
    }

    /// <summary>
    /// 计算类
    /// </summary>
    public class Cal
    {
        /// <summary>
        /// 计算两个商品的总金额
        /// </summary>
        /// <param name="method">传入计算方法</param>
        /// <param name="x">商品一金额</param>
        /// <param name="y">商品二金额</param>
        /// <returns></returns>
        public float Sell(ICal method,float x,float y)
        {
            return method.Add<float>(x, y);
        }
    }

    /// <summary>
    /// 计算方法的接口
    /// </summary>
    public interface ICal
    {
        T Add<T>(T x, T y);

    }

调用的例子:

C#
        private void button1_Click(object sender, EventArgs e)
        {
            //初始化计算类
            Cal f = new Cal();
            //初始化两种计算方法类:不打折/半价
            m1 method1 = new m1();
            m2 method2 = new m2();

            MessageBox.Show("不打折:" + f.Sell(method1, 20, 30));
            MessageBox.Show("半价:" + f.Sell(method2, 20, 30));
        }


上面这个例子中,两个算法类都继承了算法接口ICal。

类Cal的Sell方法可以传入实现了接口ICal的任何一个算法类进行计算。

如果希望有更多的算法,可以再编写新的继承接口ICal的类即可,不需要修改计算类Cal,很好的遵守了开闭原则。





--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=107

标签: .NET.NET框架
分享给朋友:

“谈谈C#中的接口Interface的常用套路” 的相关文章

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件,选择和修改项目时很慢

C#的propertygrid控件是很强。可以实现类似Vitual Studio属性面板那样的效果。但是。。。。我们一直痛苦它在选择和修改项目的时候很慢。我的用法是使用控件的SelectObject来绑定数据。C# PgridMotionSpeed.SelectedObject ...

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

请看演示程序。我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。下面例子中,你无法这样写:            if(res1==null)        &nbs...

计算代码执行时间,可以精确到十亿分之一秒

计算代码执行时间,可以精确到十亿分之一秒

注:.Net的Stopwatch类可以精确到1/10000毫秒, 有没有更精确的计时吗?见下面的代码。暂时没试过效果,大家可以试下。计算某个代码片段的执行时间,精确到CPU执行一条指令所用的时间(十亿分之一秒),可用于精确计算某个算法的执行时间。 代码:C#using Syste...

C#:多进程开发,控制进程数量

C#:多进程开发,控制进程数量

正在c#程序优化时,如果多线程效果不佳的情况下,也会使用多进程的方案,如下:C#System.Threading.Tasks.Task task=System.Threading.Tasks.Task.Factory.StartNew(     &...

C# 当前不会命中断点 还没有为该文档加载任何符号

C# 当前不会命中断点 还没有为该文档加载任何符号

这个问题网上的经验大概如下:1。 清空方案,重新编译2。 删除项目bin目录下的东西,重新编译3。 解决相互引用的问题。4。 确保不是run的release5。把项目编译改为x866。 好像没发现其它的了。。。这些解决不了我们手上的项目的问题。我们的工程有几十个项目。我长话短说,解决方法是:引导项目...

C# 查询运算符测试

C# 查询运算符测试

测试一下全部的查询运算符。每天测试一部分,代码会持续更新中……C#using System;using System.Collections;using System.Collections.Generic;using System.Linq;using&nb...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。