C#接口、抽象类

本文介绍了接口和抽象类在软件工程中的作用,它们都用于抽象和解耦。抽象类作为基类提供部分实现,允许子类继承并扩展功能;接口则更专注于定义行为契约,强制实现特定方法。通过示例展示了如何使用抽象类和接口,以及它们在单元测试和依赖倒置原则中的应用,强调了接口在实现松耦合中的价值。
摘要由CSDN通过智能技术生成

什么是接口和抽象类:

  • 接口和抽象类都是“软件工程产物”
  • 具体类->抽象类->接口:越来越抽象,内部实现的东西越来越少
  • 抽象类是未完全实现逻辑的类(可以有字段和非public成员,它们代表了“具体逻辑”)
  • 抽象类为复用而生:专门作为基类来使用,也具有解耦功能
  • 封装确定的,开放不确定的,推迟到合适的子类中去实现
  • 接口是完全为实现逻辑的”类“(”纯虚类“;只有函数成员;成员全部为public)
  • 接口为解耦而生:”高内聚,低耦合“,方便单元测试
  • 接口时一个”协约“,遭遇为工业生产所熟知(有分工必有协作,有协作必有协约)
  • 它们都不能实例化,只能用来声明变量,引用具体类的实例

抽象类:

基类必须使用关键字abstract修饰,子类重写方法要用override,例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            Vehicle v = new car();
            v.Run();
        }
    }
    abstract class Vehicle 
    {
        public void Stop()
        {
            Console.WriteLine("Stopped!");
        }
        public void Fill()
        {
            Console.WriteLine("Pay and fill....");
        }
        public abstract void Run();
    }
    class car : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is Runing....");
        }
    }
    class Truck : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Truck is Runing....");
        }
    }
}   

 

添加接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            Vehicle v = new car();
            v.Run();
        }
    }
    interface IVeicleBase
    {
        void Stop();
        void Fill();
       
    }
    abstract class Vehicle : IVeicleBase
    {
        public void Stop()
        {
            Console.WriteLine("Stopped!");
        }
        public void Fill()
        {
            Console.WriteLine("Pay and fill....");
        }
        abstract public void Run();
    }
    class car : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Car is Runing....");
        }
    }
    class Truck : Vehicle
    {
        public override void Run()
        {
            Console.WriteLine("Truck is Runing....");
        }
    }
}   

接口 要求 为纯虚函数,关键字为interface 而且接口函数的方法只写void Stop()就好了,没必要写其他修饰,写会报错的。

 

接口与单元测试

  • 接口的产生:自底向上(重构),自顶向下(设计)
  • C#中接口的实现(隐式,显式,多接口)
  • 语言面对设计的内建支持:依赖反转,接口隔离,开/闭原则....

 

依赖类示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            Engine engine = new Engine();
            Car car = new Car(engine);
            car.Run(3);
            Console.WriteLine(car.Speed);
        }
    }
    class Engine
    {
        public int RPM { get; private set; }
        public void Work(int gas)
        {
            this.RPM = 1000 * gas;
        }
    }
    class Car
    {
        private Engine _engine;
        public Car(Engine engine)
        {
            _engine = engine;
        }
        public int Speed { get; private set; }
        public void Run(int gas)
        {
            _engine.Work(gas);
            this.Speed = _engine.RPM / 100;
        }
    }
}   

 

  使用接口实现松耦合

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            var user = new PhoneUser(new NokiaPhone());
            user.UserPhone();
            var user1 = new PhoneUser(new EricssonPhone());
            user1.UserPhone();
        }
    }
    interface Iphone
    {
        void Dail();
        void PickUp();
        void Receive();
        void send();
    }
    class PhoneUser
    {
        private Iphone _phone;
        public PhoneUser(Iphone phone)
        {
            _phone = phone;
        }
        public void UserPhone()
        {
            _phone.Dail();
            _phone.PickUp();
            _phone.Receive();
            _phone.send();
        }
    }
    class NokiaPhone : Iphone
    {
        public void Dail()
        {
            Console.WriteLine("Nokia calling....");
        }

        public void PickUp()
        {
            Console.WriteLine("Hello! This is Tim!");
        }

        public void Receive()
        {
            Console.WriteLine("Nokia message ring....");
        }

        public void send()
        {
            Console.WriteLine("Hello");
        }
    }
    class EricssonPhone : Iphone
    {
        public void Dail()
        {
            Console.WriteLine("Ericsson calling....");
        }

        public void PickUp()
        {
            Console.WriteLine("Hello! This is Tim!");
        }

        public void Receive()
        {
            Console.WriteLine("Ericsson message ring....");
        }

        public void send()
        {
            Console.WriteLine("Ericsson");
        }
    }
}   

 

   

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波雅_汉库克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值