精华内容
下载资源
问答
  • 很多C#的初学者在编程时都容易把抽象类和接口搞混,本文就为大家从概念上讲解抽象类和接口区别: 一、抽象类: 含有abstract修饰符的class即为抽象类抽象类是特殊的类,只是不能被实例化,可以创建一个变量,其...
  • #区别 区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;...很明显,前者相当于所说的是抽象类,而后者指的就是接口.

    #区别

    #区别一:

    两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。

    #区别二:

    抽象类在定义类型方法的时候,可以给出方法的实现部分(没有标记abstract),也可以不给出(标记abstract);而对于接口来说,其中所定义的方法都不能给出实现部分。

    #区别三:

    继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写 ;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和实现。也就是说,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。

    #接口相对于抽象类的优势

    #好处一:

    接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。

    #好处二:

    .Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。

    #好处三:

    通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。

    #好处四:

    减少值类型的拆箱操作。对于Struct定义的值类型数据,当存放集合当中,每当取出来,都需要进行拆箱操作,这时采用Struct+Interface结合的方法,从而降低拆箱操作。

    #两者的简单对比表格

    接口抽象类
    多继承支持不支持
    类型限制没有有,只能是引用类型
    方法实现继承类型中必须给出方法实现继承类中可以不给出
    扩展性比较麻烦相对比较灵活
    多层继承比较麻烦,需要借助虚函数比较灵活

    展开全文
  • 抽象类接口,因为抽象类和接口在使用方法上很类似。 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性; 接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的...

    这是【C# 教程系列第 15 篇】,如果觉得有用的话,欢迎关注专栏。

    前面几篇博客介绍了抽象类与接口,提到其中一个,很容易想到另外一个,包括搜索时自动联想的内容也是两者的区别,因为抽象类和接口在使用方法上很类似。

    如果想简单看下两者区别的,这里我以 Excel 表格形式做了总结。
    在这里插入图片描述
    如果想深入了解两者区别的,可以看下方内容。

    为方便理解,这里我再简述一下抽象类与接口。

    抽象类:

    抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;

    重要的是抽象类可以包括抽象方法,这是普通类所不能的。

    抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。

    另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

    接口:
    接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。

    除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。

    相同点:

    1. 都可以被继承。
    2. 不能被实例化。
    3. 自身不提供实现代码。
    4. 派生类必须实现未实现的方法。

    不同点:

    1. 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。
    2. 接口可以被多重实现,抽象类只能被单一继承。
    3. 一个类一次可以实现若干个接口,但是只能扩展一个父类。
    4. 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法默认为非虚的,不过你也可以声明为虚的。
    5. 抽象类实现了 OOP 中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的交给子类去实现。
    6. 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其它方法,就叫接口污染。

    下面我单独将 相同点 里的第三条(自身不提供实现代码)抽出来。因为这点对抽象类与接口来说并不完全相同。

    //抽象类的定义
    public abstract class Test
    {
        public void DoWork()
        {
            Debug.Log("Working");
        }
    
        public abstract int Value { get; set; }
    }
    
    //接口的定义
    public interface ITest
    {
        void DoWork();
        int value { get; set; }
    }
    

    通过上面两段代码,我们会发现以下几点差异。

    1. 抽象类的成员定义是带有可访问性关键字的(例如:public),而接口是不带可访问性关键字的,因为接口中所声明的成员都是公共的(隐式public),所以没有必要添加访问修饰符。
    2. 抽象类除了包含抽象成员外,还可以包含非抽象成员,也包括构造函数、而接口不能包含具备实现代码的成员,也不能包含构造函数。因为接口是另一种类型,不是类,而抽象类是类的一种。

    你的问题得到解决了吗?欢迎在评论区留言。

    赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


    结束语

    技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

    最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
    展开全文
  •  二、接口接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1、不能实例化; 2、包含未实现的方法声明; 3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员...
  • 接口和抽象类有什么区别接口和抽象类有什么共同点? 接口和抽象类有什么不同点? 接口和抽象类分别在哪种场合使用?

    前言:前面我们详细的讲解过C#中的接口和抽象类,那本篇文章我们来详细的看看他们到底区别在哪里?
    直通车: C#接口(Interface)C#抽象类

    一、两者的区别

    相同点

    1. 两者都不能直接实例化
    2. 两者都包含未实现的方法声明
    3. 派生类必须实现未实现的方法,抽象类是抽象方法,接口是所有成员(不仅是方法还包括其他成员)

    不同点

    区别类型接口抽象类
    定义使用interface关键字定义使用abstract关键字定义
    成员在接口中仅能定义成员,但不能有具体的实现抽象类除了抽象成员以外,其他成员允许有具体的实现
    成员变量接口中定义的变量只能是公共的静态的常量(public static final)抽象类中的变量是普通变量
    声明在接口中不能声明字段,并且不能声明任何私有成员,成员不能包含任何修饰符在抽象类中能声明任意成员,并能使用任何修饰符来修饰
    继承接口能使用类或者结构体来继承,一个接口可以继承多个接口,但是接口不能继承类抽象类仅能使用类继承,也就是说不能通过接口继承,在类继承接口的同时还可以继承其他类,一个类只能继承一个父类
    实现在使用类来实现接口时,必须隐式或显式地实现接口中的所有成员,否则需要将实现类定义为抽象类,并将接口中未实现的成员以抽象的方式实现在使用类来继承抽象类时,必须将抽象类中所有抽象成员实现,如果没有将抽象成员全部实现,则必须将这个实现类定义为抽象类
    实现方法直接实现使用override关键字实现抽象方法
    抽象级别
    使用场景接口是适合为不相关的类提供通用功能抽象类主要用于关系密切的对象

    二、两者的使用场景

    1. 如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
    2. 如果要设计大的功能单元,则使用抽象类。如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。
    3. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
    4. 抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
    5. 接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染;


    阅读完是否感觉现在对接口和抽象类区别的很清晰呢?快来评论区抢沙发!!!

    展开全文
  • 浅析C#抽象类和接口区别

    万次阅读 2015-09-01 09:00:24
    文章《浅析C#接口的重要性》中讲述了如何声明使用接口。但是C#具有abstract关键字形成的抽象类,那么二者我们该如何选择呢!C#允许把类函数声明为abstract。抽象类不能实例化,而抽象函数也不能直接实现,必须...

    文章《浅析C#中接口的重要性》中讲述了如何声明和使用接口。

    但是C#具有abstract关键字形成的抽象类,那么二者我们该如何选择呢!

    C#允许把类和函数声明为abstract。抽象类不能实例化,而抽象函数也不能直接实现,必须在非抽象的派生类中重写。显然,抽象函数本身是虚拟的,但是不能提供virtual关键字。如果类包含了抽象函数,则该类也是抽象的,必须声明为抽象。

    定义抽象类:

    public abstract class Animal
    {
        protected string _name;
        public abstract string Name
        {
            get;
        }
        public abstract void Show();
        public void MakeVoice()
        {
            Console.WriteLine("All animals can make voice!");
        }
    }

    定义接口:

    public interface IAction
    {
        void Move();
    }

    实现抽象类和接口:

    public class Duck : Animal, IAction
    {
        public Duck(string name)
        {
            _name = name;
        }
        public override void Show()
        {
            Console.WriteLine(_name + "is showing for you!");
        }
        public override string Name
        {
            get{return _name;}
        }
        public void Move()
        {
            Console.WriteLine("Duck also can swim.");
        }
    }
    public class Dog : Animal, IAction
    {
        public Dog(string name)
        {
            _name = name;
        }
        public override void Show()
        {
            Console.WriteLine(_name + "is showing for you!");
        }
        public override string Name
        {
            get{return _name;}
        }
        public void Move()
        {
            Console.WriteLine(_name + "Duck also can run.");
        }
    }

    客户端实现:

    public class TestAnimal
    {
        public static void Main(string [] args)
        {
        Animal duck = new Duck("Duck");
        duck.MakeVoice();
        duck.Show();
        Animal dog = new dog("Dog");
        dog.MakeVoice;
        dog.Show();
        IAction dogAction = new Dog("A big dog");
        dogAction.Move();
        }
    }

    1.抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。

    2.所有代码共有和可扩展性考虑,尽量使用Abstract Class。

    3.当在差异较大的对象间寻求功能上的共性时,使用接口;当共性较多的对象间寻求功能上的差异时,使用抽象类。

    4.如果要创建组件的多个版本,建议使用抽象类。如果设计小而简练的功能块,则使用接口。

    展开全文
  • C#抽象类和接口

    千次阅读 2018-01-07 20:56:01
    一、抽象类:类是一个具有相同特征行为的抽象,而抽象类(class 前加上 abstract)没有指出行为的具体细节,而由他的子类去实现相应的行为。 注意:一个非密封类(密封类使用 sealed 修饰)可以派生子类,子类...
  • C#浅谈NET抽象类和接口区别

    千次阅读 2018-06-21 18:07:37
    一、抽象类:在类声明中使用abstract修饰符的类称为抽象类。含有一个或一个以上的抽象成员的类,必须定义为抽象类。当方法声明包含abstract修饰符时,称该方法为抽象方法,虽然抽象方法同时隐含为虚拟方法,但是它不...
  • (3) 抽象类可以但不是必须有抽象属性抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,...
  • 一、抽象类抽象类声明方法的存在而不去实现(abstract class),用于创建一个体现某些行为的类,并为改类声明方法,但是不能在该类中实现该类的方法。不能创建abstract 类的实例。却可以创建一个变量,他也是一个...
  • c#抽象类和接口。 相同点: (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 区 别: (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、...
  • 接口,在表面上是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被或其他接口所实现(或者也可以说继承)。它在形式上可能是如下的样子: interface InterfaceName { void Method1(); void ...
  • PAGE / NUMPAGES 注意我在这里所描述的抽象类和接口是基于 C#的 一抽象类 抽象类是特殊的类只是不能被实例化除此以外具有类的其他特性重要的是抽象类可以包括抽象方法这是普通类所不能的抽象方法只能声明于抽象类中...
  • C#基础——(抽象类接口,普通类之间的区别

    千次阅读 热门讨论 2019-05-15 15:58:00
    什么是抽象类接口、普通类呢? 抽象类:在编程语句中,把用abstract关键字修饰的类称为抽象类抽象类是不完整的,只能作为基类。一般用来进行类型隐藏充当全局变量的角色。 abstract class Animal { public ...
  • C#类、接口、虚方法抽象方法-接口抽象类区别实例 C#类、接口、虚方法抽象方法-接口抽象类区别实例
  • C#抽象类和接口区别

    千次阅读 2008-12-18 09:41:00
    C#抽象类和接口区别 (2008-10-27 17:30:33)标签:杂谈 分类:.net抽象类和接口区别区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”...
  • 那么就可以使用抽象类定义基类,即使用abstract关键字声明Class并且abstract声明抽象类中方法(抽象类中可以有抽象方法也可以有实方法-》这里的实方法指的是非虚方法,abstract可以看做隐式的虚方法 ) ...
  • 主要介绍了C#中实现抽象类里建立静态方法,需要的朋友可以参考下
  • typeScript 抽象类和接口区别

    千次阅读 2021-03-10 11:06:21
    抽象类和接口区别? 1.什么是抽象类 抽象类,顾名思义,即类的抽象,从面向对象的角度来想,世界万物都可以用类来定义(男人是个类,女人是个类,奔驰是个类,宝马也是个类),那么抽象类又是类的抽象,举个例子,...
  • 抽象类 通过在类定义前面放置关键字 abstract,可以将类声明为抽象类抽象类不能实例化。 抽象类的用途是提供一个可供多个派生类共享的通用基类定义。...抽象类和抽象方法都必须在派生类中用override进行重写。 抽象
  • c#抽象类和接口的学习
  • PAGE / NUMPAGES 很多人在学习抽象类和接口时弄不明白两者之间的区别弄不明白的原因它们之间有太多的相似性那么本文着重介绍两者之间的区别以让大家弄清楚C#抽象类和接口到底有什么区别它们主要用在什么场合 1抽象...
  • C#抽象类和接口的异同 一. 相同点 都可以被继承 都不能被实例化 都可以包含方法声明 二.区别 区别: 抽象基类可以定义字段,属性,方法实现,构造函数。接口只能定义属性,索引器,事件,方法声明 抽象类是一个不...
  • 接口类的使用 抽象类的使用 总结: 当在差异较大的对象间寻求功能上的共性时,使用接口。 当在共性较多的对象间寻找功能上的差异时,使用抽象基类。
  • C#抽象类和接口区别.txt
  • /// 接口的例子,接口是顶层设计////////////////////////// /// interface IAnimal //顶层接口 { void eating(); //接口中声明的方法,这里不可以用static,abstract修饰 } abstract class Bird :IAnima
  • 问题:编写一个程序以演示抽象类和接口,要求如下: (1)定义一个Employee抽象类,其中包含NameSalary属性及Print()抽象方法。类似地,定义IPromotableIGoodStudent两个接口,使它们都包含Promote()方法。 (2)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,963
精华内容 25,585
关键字:

c#抽象类和接口的区别

c# 订阅