1.首先来看一看抽象类

抽象类是特殊的类,不能够被实例化;具有类的其他特性;抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写。
另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
关键字就是 abstract
/*
* 抽象方法必须写在,抽象类中
*
*/
public abstract class Animal
{ public abstract void Sleep();
public abstract void Eat();
}

这里定义了一个抽象类和两个抽象方法,之后我们在定义子类去继承它

/*
*抽象类必须被重写
*/
public class cat : Animal
{
public override void Eat()
{
Console.WriteLine("我是cat,重写了Eat");
} public override void Sleep()
{
Console.WriteLine("我是cat,重写了Sleep");
}
}

这里定义了一个cat类去继承Animal,如果不实现的话,就会报如下的错误

这里vs开发工具就会提示我们实现抽象类,vs可以自动帮我们去实现,然后去写自己的代码就可以了,然后就是调用

            Animal an = new cat();
an.Eat();
an.Sleep();

因为cat类继承了Animal并重写了里面的方法,所以我们可以直接替换Animal让cat代替出现,抽象类同样也可以定义自己的方法,例如:

    public abstract class Animal
{
public void show()
{
Console.WriteLine("我是抽象类自己的方法");
}
public abstract void Sleep();
public abstract void Eat();
}

2.我们再来看一看虚方法

virtual关键字用于修饰方法

/*
* 虚方法,必须有方法体
*/
public class people
{
public virtual void Sleep() { }
public virtual void Eat() { }
}

定义虚方法必须要有方法体,然后定义子类去继承people

/*
* 虚方法可以不被重写
*/
public class student:people
{
public override void Sleep()
{
Console.WriteLine("我是student,");
}
}

如果说只是继承了people这个类而没有去重写它的方法,这样的情况是不会报错的,我在这里只是重写了people的Sleep方法,override后面加返回值类型 基类的方法名

然后就是调用

people op = new student();
op.Sleep();

3.然后就是接口

接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量

/*
* 接口中的成员是隐式公有的,不能加修饰符
*/
public interface ImyInterface
{
int aa { get; set; }
void test();
}

然后我们去定义子类,实现接口

public class overInterface : ImyInterface
{
public int aa { get; set; } public void test()
{
Console.WriteLine("我实现了接口,");
}
}

如果不实现接口,就会报以下错误

然后就是调用

ImyInterface ter = new overInterface();
ter.aa = ;
ter.test();
Console.WriteLine(ter.aa);

那么我们来总结一下

抽象方法:

1.必须定义在抽象类中,

2.不能够被实例化

3.子类必须对其进行重写

4.定义抽象方法时不能够有方法体  { } 都不能有

5:关键字 abstract

虚方法:

1:可以不被重写

2:定义方法时能够有自己的方法体

3:关键字:virtual

接口:

1:定义时不能加访问修饰符,也不能有方法体

2:它的子类必须实现所有方法,与抽象类相似

3:关键字:interface

那么这里有一个问题:

接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

答案:

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。


C#中的抽象方法,虚方法,接口之间的对比的更多相关文章

  1. C#中virtual(虚方法)的理解以及和abstract(抽象方法)的区别

    Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例 ...

  2. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  3. C++中的纯虚方法

    在学习数据结构中优先级队列时遇到纯虚方法的定义,一时没想起来,便查了一下. 1.纯虚方法解决什么样的问题,为什么要设计出纯虚方法? 考虑下面的需求,基类声明了一个方法,这个方法只针对具体的子类才有意义 ...

  4. 浅谈C#抽象方法、虚方法、接口

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  5. 虚方法(virtual)和抽象方法(abstract)的和接口(interface)的区别

    虚方法(virtual)和抽象方法(abstract)的区别 2017年06月15日 13:41:26 阅读数:65 注:本文转载自 http://www.cnblogs.com/michaelxu/ ...

  6. 虚方法(virtual)\抽象方法(abstract)\接口(interface)的区别

    转自:https://www.cnblogs.com/fantaohaoyou/p/9402657.html 虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽 ...

  7. C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件

    一.理解:抽象方法,虚方法,接口,事件 描述: 1.定义一个抽象父类"People": 要求: 1>3个属性:名字,性别,年龄: 2>一个普通方法"说话&qu ...

  8. 关于C#中的抽象类、抽象方法和虚方法的探究

    2016年的第一篇文章,容我先喷喷新年的情怀,..........,好了,喷的差不多了. 在面向对象中,我们需要对类进行横向和纵向的认识,不同的类有不同特色的成员,同时在不同类的继承中,子类获得父类的 ...

  9. C#中抽象方法与虚方法的区别

    一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People   //声明一个抽象类 { ...

随机推荐

  1. HTML学习---HTTP基础学习详解

    1.HTTP访问服务器原理 客户端输入IP->查找本地hosts缓存->有则直接用获取到的IP访问服务器->服务器响应后返回客户端->客户端页面显示               ...

  2. 沉淀再出发:java中的HashMap、ConcurrentHashMap和Hashtable的认识

    沉淀再出发:java中的HashMap.ConcurrentHashMap和Hashtable的认识 一.前言 很多知识在学习或者使用了之后总是会忘记的,但是如果把这些只是背后的原理理解了,并且记忆下 ...

  3. TCP/IP 协议图--网络层中的 IP 协议

    IP(IPv4.IPv6)相当于 OSI 参考模型中的第3层——网络层.网络层的主要作用是“实现终端节点之间的通信”.这种终端节点之间的通信也叫“点对点通信”. 网络的下一层——数据链路层的主要作用是 ...

  4. 015.4守护线程和join

    内容:守护线程.join方法#####################守护线程通过开启线程之前调用setDaemon()方法,变成后台线程,前台线程运行完,后台线程自动会结束#########例子 c ...

  5. BZOJ1014:[JSOI2008]火星人(Splay,hash)

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...

  6. 4、RabbitMQ-消息应答与消息持久化

    消息应答( Message acknowledgment) 1. Message acknowledgment(消息应答) 执行任务可能需要几秒钟.你可能想知道如果其中一个消费者开始一项长期任务并且只 ...

  7. pyenv 配置python虚拟环境

    安装pyenv环境 yum -y install git yum install gcc make patch gdbm-devel openssl-devel sqlite-devel readli ...

  8. No.4 - 3D 空间的卡片翻转动效

    参考 ①张鑫旭http://www.zhangxinxu.com/wordpress/2012/09/css3-3d-transform-perspective-animate-transition/ ...

  9. PAT——1037. 在霍格沃茨找零钱

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...

  10. 404 Note Found 队-Alpha1

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...