博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中的抽象方法,虚方法,接口之间的对比
阅读量:5743 次
发布时间:2019-06-18

本文共 2444 字,大约阅读时间需要 8 分钟。

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 = 45;            ter.test();            Console.WriteLine(ter.aa);

那么我们来总结一下

抽象方法:

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

       2.不能够被实例化

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

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

       5:关键字 abstract

虚方法:

       1:可以不被重写

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

       3:关键字:virtual

接口:

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

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

       3:关键字:interface

那么这里有一个问题:

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

答案:

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

 

 

 

转载于:https://www.cnblogs.com/NiuZiXiao/p/10249126.html

你可能感兴趣的文章
Android开发历程_15(AppWidget的使用)
查看>>
阿花宝宝 Java 笔记 之 初识java
查看>>
7、设计模式-创建型模式-建造者模式
查看>>
Cesium官方教程11--建模人员必读
查看>>
我国古代的勾股定理
查看>>
Linux下的C编程实战
查看>>
[32期] html中部分代码与英语单词关系
查看>>
PHP安装环境,服务器不支持curl_exec的解决办法
查看>>
jQuery|元素遍历
查看>>
RedHat 6 安装配置Apache 2.2
查看>>
Openstack 安装部署指南翻译系列 之 Manila服务安装(Share Storage)
查看>>
underscore.js学习笔记
查看>>
windows下常用命令
查看>>
1.5编程基础之循环控制_29:数字反转
查看>>
组策略 之 设备安装设置
查看>>
人工智能还能干这些?这8种AI应用你可能意想不到
查看>>
实现Hyper-V 虚拟机在不同架构的处理器间迁移
查看>>
简单使用saltstack
查看>>
针对web服务器容灾自动切换方案
查看>>
突破媒体转码效率壁垒 阿里云首推倍速转码
查看>>