面向对象设计原则详解:依赖倒置原则

  定义:抽象不应该依赖于细节。细节应该依赖于抽象。程序中所有的依赖关系都应该终止于抽象类和接口。针对接口而非实现编程。任何变量都不应该持有一个指向具体类的指针或引用。任何类都不应该从具体类派生。任何方法都不应该覆写他的任何基类中的已经实现了的方法。
    说通俗一点就是,你抽象了一个类,这个类在这个工程中可以用,如果再做一个工程,移植过来还能用。遵循这一目的是为了代码的复用。不过这一条规则我觉得原则上可以遵守,但是不一定非要遵守。除非你确定目前的工程,在后续的新工程中需要复用。比如说,开发手机的系统,一般情况下后续多个型号都是以第一个开发出的那个系统为基础的。模块移植很多,这种情况下必须考虑依赖倒置原则。但是如果你正在做的工程,你很清楚这个工程,后面的开发不会再用目前的代码了,比如,下一个版本的软件要换另一种语言开发,那就没必要非得遵守这个原则了。
    如何遵守依赖倒置原则呢?
    1、通过构造函数或者方法传递依赖对象;
    2、通过set方法传递依赖对象;
    3、接口声明实现依赖对象。
    结合以上三条,看下面的例子。
    例如,一个程序员开始写代码。
    public class CSharp
    {
        public void Coding()
        {
            Console.WriteLine("使用C#开始写代码。");
        }
    }
    public class Programer
    {
        private string name;

        public Programer(string name)
        {
            this.name = name;
        }

        public void Coding(CSharp csharp)
        {
            Console.Write(name);

            csharp.Coding();
        }
    }

调用

  static void Main(string[] args)
  {
     Programer programer = new Programer("小白");

     programer.Coding(new CSharp());

     Console.ReadLine();
  }

输出:

小白使用C#开始写代码。

可是这样programer只会用C#,这不行的,要多学几门编程语言。c#只是一门编程语言,抽象一下。

    public abstract class ProgramLangvage
    {
         public abstract void Coding();
    }

    public class CSharp:ProgramLangvage
    {

        public override void Coding()
        {
            Console.WriteLine("使用C#开始写代码。");
        }
    }

    public class Java : ProgramLangvage
    {

        public override void Coding()
        {
            Console.WriteLine("使用Java开始写代码。");
        }
    }

    public class Programer
    {
        private string name;

        public Programer(string name)
        {
            this.name = name;
        }

        public void Coding(ProgramLangvage programLnagvage)
        {
            Console.Write(name);

            programLnagvage.Coding();
        }
    }

 调用

     class Program
    {
        static void Main(string[] args)
        {
            Programer programer = new Programer("小白");

            programer.Coding(new CSharp());

            programer.Coding(new Java());

            Console.ReadLine();
        }
    }

 输出:
 小白使用C#开始写代码。
 小白使用Java开始写代码。
 这样Programer和ProgramLangvage结合,就达到了复用的目的,在其他工程中,只需对ProgramLangvage实现不同就可以了,调用programer.Coding的地方基本不用修改。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值