C#接口和抽象类的区别

1.前言

对于接口和抽象类概念中非常混淆,今天就来总结一下两者之间的区别。

2.接口

接口是一种定义的规范,在实际开发中,编码者会规定这种规范,下一任编码者必须按照定义好的规范去实现具体的业务,如果没有定义接口规范,那开发不是乱套了吗。接口可以包含方法、属性、索引器和事件作为成员。

接口存在的意义是为了实现多态;
接口中只能包含方法(属性、事件、索引);
接口的成员不能有任何实现;
接口不能被实例化;静态类、抽象类不能直接被实例化
接口的成员不能有访问修饰符(默认为public);
实现接口的子类必须将接口的所有成员函数实现;
子类实现接口的方法时,不需要任何关键字,直接实现即可。(抽象类、虚方法需要加override

注意:虽然抽象类不能直接的进行实例化(new),但是可以间接通过对子类的实例化间接可以实例化父类,也就是通过父类的应用来指向子类的实例间接地实现父类的实例化,因为子类在实例化之前,一定会先实例化它的父类。这样创建了继承抽象类的子类对象,也就把其父类(抽象类)给实例化了。

应用理解如下:(首先,定义一个抽象类B,包含抽象方法play())

    public abstract class B {
	private String str;
	
	public B(String a){
		System.out.println("父类已经实例化");
		this.str = a;
		System.out.println(str);
	}
	
	public abstract void play();
}

然后,定义一个子类C去继承类B,并实现其中的抽象方法:

    public class C extends B{
	public C(String c){
		super(c);
		System.out.println("子类已经被实例化");
	}
 
	@Override
	public void play() {
		System.out.println("我实现了父类的方法");
	}
	
	public static void main(String[] args){
		B c = new C("c");
	}
}
 

运行结果如下:

父类已经实例化
c
子类已经被实例化

3.抽象类

抽象类,在面向对象过程中,所有的对象都是类描绘的,反过来,类里面的数据不足以把具体的对象描绘出来,这样的类就是抽象类。

抽象方法只能出现在抽象类中,但是抽象类中可以包含普通方法。普通类中只能包含普通方法
在父类中定义的抽象方法不能实现。普通方法可以实现
抽象类不能实例化(也就是不能new出来)。
抽象类与抽象方法需要添加abstract关键字。
子类实现父类的抽象方法时,需要添加override关键字。
如果抽象类的子类不是抽象类,那么子类中必须重写父类抽象类的所有抽象方法。
抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类(普通类)必须覆盖它们。

4、抽象类和接口的相同点和区别

相同点:

  1. 抽象类和接口都不能实例化。
  2. 包含未实现的方法声明
  3. 派生类继承抽象类或者接口的时候,都必须实现抽象类中的抽象方法,或者实现接口的所有成员。

不同点:

  1. 抽象类可以通过间接实例化子类的方式来实例化抽象类,但是接口不能这样。
  2. 抽象类只能单继承,而接口可以多继承(继承多个接口,逗号隔开,但是接口不能继承类)
  3. 接口只能定义抽象规则,抽象类既能定义抽象规则也能提供已实现的成员。
  4. 接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念。
  5. 接口支持回调,抽象类不能实现回调,因为继承不支持。
  6. 接口多定义对象的行为,抽象类多定义对象的属性。

5.代码分析

接口实例

    using System;
//接口的定义
interface ICreature
{
    void Eat();
    void Walk(int distance);
    string Vocalize();
}
 
public class Author : ICreature
{
    private string name;
    public Author(string name)
    {
        this.name = name;
    }
    public void Eat() { }
    public void Walk(int distanc) { }
    public string Vocalize()
    {
        return "";
    }
}
 
class Program
{
    static void Main(string[] args)
    {
        ICreature man = new Author("marcopro");
        man.Eat();
        man.Walk(10);
        man.Vocalize();
    }
}

抽象类实例

    using System;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Author ar = new Author("Tom");
            Reader rdr = new Reader("Jack");
            Console.WriteLine(ar.name);
            Console.WriteLine(rdr.name);
            ar.doSomething();
            rdr.doSomething();
        }
    }
 
    public abstract class Human
    {
        public string name;
        public int age;
 
        public Human(string name)
        {
            this.name = name;
            this.age = 0;
        }
        public void  showBaseInfo(){ } 
 
        public void showFullInfo(){ }
       
        public void doSomething() {
 
            Console.WriteLine(this.name+": let me do something!");
        }
    }
 
    public class Author:Human
    {
        public Author(string name) : base(name) { }
 
    }
 
    public class Reader : Human
    {
        public Reader(string name) : base(name) { }
    }
}
 
全部评论

相关推荐

咦哟,从去年八月份开始长跑,两处实习转正都失败了,风雨飘摇,终于拿到offer了更新一下面试记录:秋招:多部门反复面试然后挂掉然后复活,具体问了啥已经忘了,只是被反复煎炸,直至焦香😋春招:base北京抖音hr打来电话说再次复活,准备面试,gogogo北京抖音一面:六道笔试题:1.promise顺序2.定义域问题3.flat展开4.并发请求5.岛屿数量算法(力扣)深度,广度都写6.忘记了,好像也是算法,难度中等其他问题多是框架底层设计,实习项目重难点~~~秒过😇北京抖音二面:三道笔试题:(为什么只有三道是因为第三道没做出来,卡住了)1.中等难度算法(忘记啥题了,应该是个数组的)2.认识js的继承本质(手写继承模式,深入js的面相对象开发)3.手写vue的响应式(卡在了watch,导致挂掉)---后知后觉是我的注册副作用函数写得有问题,有点紧张了其他题目多是项目拷打,项目亮点,对实习项目的贡献~~~第二天,挂,but立马复活转战深圳客服当天约面深圳客服一面:六道笔试题,由于面过太多次字节,面试官叫我直接写,不用讲,快些写完😋,具体都是些继承,深拷贝(注意对数组对象分开处理,深层次对象,循环引用),加中等难度算法题~~~秒过深圳客服二面:口诉八股大战:大概囊括网络,浏览器渲染原理,动画优化,时间循环,任务队列等等(你能想到的简单八股通通拉出来鞭尸😋)算法题:笔试题6道:1:找出数组内重复的数,arr[0]-arr[n]内的数大小为[1-n],例如[1,2,2,3,3]返回[2,3],要求o(n),且不使用任何额外空间(做到了o(n),空间方面欠佳,给面试官说进入下一题,做不来了)2:原滋原味的继承(所以继承真滴很重要)3:力扣股票购买时机难度中等其他滴也忘记了,因为拿到offer后鼠鼠一下子就落地了,脑子自动过滤掉可能会攻击鼠鼠的记忆😷~~~秒过深圳客服三面:项目大战参与战斗的人员有:成员1:表单封装及其底层原理,使用成本的优化,声明式表单成员2:公司内部库生命周期管理成员3:第三方库和内部库冲突如何源码断点调试并打补丁解决成员4:埋点的艺术成员5:线上项目捷报频传如何查出内鬼成员6:大文件分片的风流趣事成员7:设计模式对对碰成员8:我构建hooks应对经理的新增的小需求的故事可能项目回答的比较流利,笔试题3道,都很简单,相信大家应该都可以手拿把掐😇~~~过过过无hr面后续煎熬等待几天直接hr打电话发offer了,希望大家也可以拿到自己心仪的offer
法力无边年:牛哇,你真是准备得充分,我对你没有嫉妒,都是实打实付出
查看19道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务