【C#】——抽象类VS接口

    话说开始大话模式的学习了,可是C#中一些概念还没懂呢!真是惭愧,出来混的早晚要还的,开始新一轮的还债之路。


何为抽象类?

    在面向对象的概念中,所有的对象都可以用类来表示,但是并不是所有的类都有具体的对象可以对其实例化,所以这样的类就叫做抽象类。例如Animal类,说new Animal();实例一个动物,但是一个动物长什么样?不知道,动物就是一个抽象类,不能描述一个具体的对象与之对应。

C#允许把类和方法声明为abstract,即抽象类和抽象方法。抽象类应该拥有尽可能的共同的代码,拥有尽可能少的数据。

 

<span style="font-family:KaiTi_GB2312;font-size:18px;">abstract class Animal     //加abstract关键字,表明是抽象类
    {
        protected abstract string getShoutSound();
        //在方法的返回值前加abstract表明此方法是抽象方法,抽象方法没有方法体,直接在括号后加“;”
        
    }</span>

C#中抽象的特点

1、抽象类不能被实例化

2、抽象方法是必须被子类重写的方法

3、如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含一般方法。

抽象类是提供一个抽象的概念,他提供一个继承的出发点,新的抽象类的建立,一定是用来继承的。在一个以继承关系形成的等级结构里面,树叶节点就是具体类,而树枝节均为抽象类。(这个相当在一棵树上,树叶继承树枝)

具体的内容请见下图:

             


何为接口?

    接口是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦类实现了接口,类就可以支持接口所特定的所有属性和成员。声明接口在语法上于与声明抽象类完全相同,但不允许提供接口中任何成员的执行方式。

<span style="font-family:KaiTi_GB2312;font-size:18px;">interface IChange
    {
        string ChangeThing(string thing);
        //声明一个Ichangething接口,此接口有一个方法Changthing,参数是一个字符串变量,返回一字符串。
    }</span>

举个例子:抽象类——人;具体类——男人,女人;超人继承男人的所有方法和属性,但是超人有一个特殊技能:飞!如何实现?这个时候就用到的是接口。

              


抽象VS接口

    接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。

    抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

概念上的比较

第一:类是对对象的抽象,抽象类是对类的抽象;接口是对行为的抽象。

第二:如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类。

第三:从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口根本不知道子类的存在,方法实现还不能确认,预先定义。

这些内容都是从书本上提出的具体概念,有些其他的内容,其实更重要的是有我们自己的认识。

理解两者不同之处

1、接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
2、接口可以多继承,抽象类不行
3、接口定义方法,不能实现,而抽象类可以实现部分方法。
4、接口中基本数据类型为static 而抽类象不是的。


【总结】

    当我们关注一个事物的本质的时候,用抽象类;关注一个操作的时候,用接口。抽象类的功能要远超过接口,但是定义抽象类的代价高,每个类只能继承一个类,在这个抽象类中必须写出其所有子类的所有共性。虽然接口的功能上会弱化很多,但是它只是针对一个动作的描述,而且我们可以在一个类中同时实现多个接口。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mandy_i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值