C#类、接口、虚方法和抽象方法

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

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、抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

C#类、接口、虚方法和抽象方法相关推荐

  1. C#类、接口、虚方法和抽象方法-虚拟方法与抽象方法之区别

    虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,并为派生类提供了重写该方法的选项.抽象方法没有提供实现部分,抽象方法是一种强制派生类重写的方法,否则派生类将不能 ...

  2. 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类

    //抽象方法类似与接口; 在没有接口的年代 Delphi 是用抽象方法来模拟接口的; 我想它最终会被接口替代.{下面就定义了两个抽象方法} TMyClass = class(TObject)proce ...

  3. java虚方法和抽象方法_虚方法和抽象方法--基础回顾

    抽象方法是只有定义.没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写:虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖. 重写的子类虚函数就是被覆盖了. 抽象方 ...

  4. 重写方法,重载方法,虚方法和抽象方法的使用

    重写方法,重载方法,虚方法和抽象方法. 重写:指子类重新实现父类的某些方法,以实现一些新的功能.重写的关键字是override.并且重写的方法其签名是相同的. 重载:指允许类中具有相同函数名的方法,但 ...

  5. LindAgile~缓存拦截器支持类的虚方法了

    写它的原因 之前写过一个缓存拦截器,主要在方法上添加CachingAspect特性之后,它的返回值就可以被缓存下来,下次访问时直接从缓存中返回结果,而它有一个前提,就是你的方法需要是一个接口方法,缓存 ...

  6. 虚方法和抽象方法的区别

    在查阅资料的过程中,偶然看到了虚方法和抽象方法,对其做个小结. 对比学习: 虚方法必须有实现部分,抽象方法不可以有实现部分: 虚方法可以在派生类中重写也可以不重写,抽象方法必须在派生类中重写: 虚方法 ...

  7. C#~虚方法,虚方法和抽象方法的区别

    虚方法 特点: <1>虚方法必须使用virtual修饰 <2>虚方法同抽象方法(adstract)一样使用override关键字重写 <3>虚方法在子类中可以实现, ...

  8. 设计一个形状类(接口)Shape,方法:求周长和求面积形状类(接口)的子类(实现类):

    设计一个形状类(接口)Shape,方法:求周长和求面积 形状类(接口)的子类(实现类): package zuoye2;public interface Shape {// 求面积方法double g ...

  9. 设计一个形状类(接口)Shape,方法:求周长和求面积

    3.设计一个形状类(接口)Shape,方法:求周长和求面积形状类(接口)的子类(实现类):Rect(矩形)Circle(圆形)Rect类的子类:Square(正方形)不同的子类会有不同的计算周长和面积 ...

最新文章

  1. 关于Enterprise Library 两个网占.
  2. 个性化推荐系统研究热点之用户画像
  3. Ardino基础教程 19_舵机控制
  4. wordpress备份方法比较
  5. Spring MVC-集成(Integration)-集成LOG4J示例(转载实践)
  6. 【错误】【vscode】'#' not expected here
  7. jQuery中animate( )的方法及$(“body“).animate({‘scrollTop‘:top},500)不被Firefox支持问题的解决
  8. 200 个工具分析机器学习十年:前途未卜、工程师是核心!
  9. python 多态 锁_python 上下文管理器,多态,数据锁定与自省,
  10. SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘staff_info.depart_id‘ in ‘where clause‘
  11. sql数据库快照与恢复 规则绑定
  12. 如何给程序添加数字签名 sign
  13. wireshark抓取手机app包
  14. Codeforces 760B Frodo and pillows
  15. PDF阅读器开关“手型工具阅读文章”功能
  16. iPad 必备软件 | 帮你实现百度云倍速
  17. Python界面编程第二课:Pyside2 创建窗口 (Python GUI)
  18. react---收藏的点击和取消(刷新还会存在)--demo
  19. 洛谷P1462 通往奥格瑞玛的道路 题解
  20. 使用python代码举例说明离散随机变量

热门文章

  1. IBM Holosofx 进行业务流程管理
  2. 我们能用 lua 做什么
  3. jdk的selector(1)
  4. Linux关机运行的脚本,Linux 关机 脚本
  5. Lucene搜索引擎
  6. MySQL information_schema 系统库介绍
  7. 从 Go 语言一个文件描述符错误讲起
  8. 微信公众平台开发模式背后的原理?
  9. cpu负载过高问题处理
  10. EASYUI 表单(FORM)用法