设计模式聊通透(2_1)接口和抽象类,如何选择

什么是抽象类(Abstract)

抽象类就是声明为抽象的类,具有以下特点。

  • 不能实例化,即不能new一个对象出来;
  • 可以被继承;
  • 可以包含抽象方法,也可以没有抽象方法(抽象方法是使用Abstract声明,但是没有实现);
  • 可以有静态字段和静态方法;
  • 非抽象子类必须实现所继承的抽象类的所有抽象方法;
    下面是抽象类的示例。
    abstract class SampleAbstract
    {
        public static string CommonInfo = "commoninfo";
        private string privateInfo = "private Info";   
        
        public string Name { get; set; } = "";

        public void ShowPrivateInfo()
        {
            Console.WriteLine(privateInfo);
        }

        public abstract void Method1();
    }

什么是接口

  本节主要摘自:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/
  接口定义了一个规定(contract,又称为合同等),任何类或者结构(struct)要实现这个接口,那么必须实现接口中的规定。
  从C#8.0开始,接口可以定义默认实现。
  为了描述本质信息,以下的说明都是基于C#8以下的版本。
  接口具有以下特点。

  • 具有方法、属性、索引器、事件等成员(默认为public,因此不用修饰符);
  • 接口可以继承自一个类或者若干个接口(类必须排在第一位);
  • 继承了接口的类或者结构必须实现接口的成员。
  • 接口无法直接进行实例化。

  下面看个例子。

    public interface ISampleInterface
    {
        void TeSampleMethods();
    }

    class ImplementationClass:ISampleInterface
    {
        public void TeSampleMethods()
        {
            Console.WriteLine("I am Implementation.");
        }
    }

  有两种使用方法。

        static void Main(string[] args)
        {
            ISampleInterface obj1 = new ImplementationClass();
            obj1.TeSampleMethods();
            ImplementationClass obj2 = new ImplementationClass();
            obj2.TeSampleMethods();
            Console.Read();
        }

  执行结果。
在这里插入图片描述

In the following example, class ImplementationClass must implement a method named SampleMethod that has no parameters and returns void.

For more information and examples, see Interfaces.

Example

接口和抽象类的异同点

  参考自以下。
https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-c-sharp/

抽象类接口
包含声明和定义(实现)仅包含声明
不能进行多继承(一个类最多只能继承自一个抽象类)能进行多个继承
包含构造器(构造函数)不能包含构造函数
可以包含静态成员不能包含静态成员
可以包含各种修饰符,如public、private、protected等只包含public类型,因为接口中的任何成员都是public
抽象类运行较快接口运行较慢,因为需要时间搜索相应的类的实际方法
可以包含方法、常量、字段等只能包含方法类型(方法、属性等)
包含的方法可以全部实现、部分实现或者不实现(子类也是抽象类,则可以部分实现父类的抽象方法)方法必须全部实现

如何选择使用

  从上节的抽象类和接口异同,可以得到如下结论:

  • 如果需要实现多个类的内在共同特征(通过常量、字段、非抽象方法等体现),使用抽象类;如果主要体现实现类的外部功能(共同的方法),使用接口;

其它参考资料

https://dzone.com/articles/when-to-use-abstract-class-and-intreface

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值