博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#类、接口、虚方法和抽象方法
阅读量:4912 次
发布时间:2019-06-11

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

虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢?

1. 虚方法必须有实现部分,并为派生类提供了重写该方法的选项。抽象方法没有提供实现部分,抽象方法是一种强制派生类重写的方法,否则派生类将不能被实例化。

//抽象方法
public abstract class Animal
{
    public abstract void Sleep();
    public abstract void Eat();
}
//虚方法
public class Animal
{
    public virtual void Sleep(){}
    public virtual void Eat(){}
}

2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写。虚方法不是也不必要重写。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。

public class Animal

{
    public abstract void Sleep();
    public abstract void Eat();
}

这样写编译器会报错。

3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚拟方法不必。抽象方法不能声明方法体,而虚拟方法可以。 包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化!

public abstract class Animal

{
    public abstract void Sleep();
    public abstract void Eat();
}
public class Cat : Animal
{
    public override void Sleep()
     {
         Console.WriteLine( "Cat is sleeping " );
     }
    // we need implement Animal.Eat() here 
}

编译器会报错,因为我们没有实现抽象类中所有抽象方法。

虚拟方法和抽象方法有什么区别与联系:

1、抽象方法只有声明没有实现代码,需要在子类中实现;虚拟方法有声明和实现代码,并且可以在子类中重写,也可以不重写使用父类的默认实现。

2、抽象类不能被实例化(不可以new),只能实例化实现了全部抽象方法的派生类;而包含虚方法的类可以实例化。

3、虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。

4、抽象方法是虚拟方法两个相像的一点是都用override重写。

 

非抽象类与接口的差别

非抽象类和接口的差别很大,它们的差别主要表现在以下几个方面:

1、非抽象类可以有成员变量、常量和构造函数,而接口中不能存在常量、域、操作符、构造函数或析构函数,而且不能包含任何静态成员。

2、一个非抽象类可以继承多个接口,而只能继承一个类;
3、非抽象类中可以定义具体的方法和实现,而接口只定义方法没有具体的实现;
4、接口成员一定是公共的,而且不能声明为虚拟或者是静态的,而非抽象类中是没有这些限制。
5、非抽象类可以被实例化,而接口不可以。一般来说,非抽象类的内容较接口要丰富得多,非抽象类可以有面向对象所有的绝大部分组成元素。但是接口相对于非抽象类来说更加灵活,两者在使用上冲突不大,在使用的时候视具体情况而定。

 

、抽象类和接口的使用:

      1、 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
      2、如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
      3、如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。   
      4、抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

转载于:https://www.cnblogs.com/songtzu/archive/2012/07/28/2613210.html

你可能感兴趣的文章
ecos启动流程分析
查看>>
Oracle CASE WHEN 用法介绍
查看>>
linux 下连接mysql服务器
查看>>
DOMContentLoad 首屏渲染
查看>>
rpm检验是否被改动过
查看>>
Sphinx-简介及原理
查看>>
【Linux】深入理解Linux中内存管理
查看>>
WEB 移动网站 手机点击 打电话 发短信
查看>>
2019CSUST集训队选拔赛题解(一)
查看>>
李晓菁201771010114《面向对象程序设计(Java)》第三周学习总结
查看>>
Typedef与Struct
查看>>
Linux常用网络命令整理
查看>>
JMeter学习笔记--使用URL回写来处理用户会话
查看>>
Error creating bean with name 'documentationPluginsBootstrapper' defined in URL
查看>>
Javascript样例之文档章节滚动全版(DOM)
查看>>
C++ 面向对象
查看>>
Maven Nexus
查看>>
js 判断滚动条的滚动方向
查看>>
关于springboot启动时候报错:springboot Failed to parse configuration class [Application]
查看>>
java中Class的使用详解
查看>>