接口 抽象类 虚方法 三者比较-1

接口

1.接口只提供方法规约,不提供方法体;

2.接口中的方法不能用关键字修饰;

3.接口里不能有接口和变量;

4.接口里的方法在子类中必须全部实现;

5.接口可以实现多重继承;

抽象类

1.抽象类可以从接口继承;

2.抽象类中的实体方法在子类中不可以重写,只可以被引用;

3.抽象类中的抽象方法不可以有方法体,抽象类中的抽象方法在子类中必须重写;

4.抽象类中的虚方法在子类中可以选择性的重写;

虚方法

1.可以在子类选择性的重写;

2.不重写也可被子类调用;

接口与抽象类的异同

1.抽象类的抽象方法和接口内的方法,在子类中必须全部被实现;

2.抽象方法和接口中的方法都不可以有方法体;

抽象方法与虚方法的异同

1.抽象方法所在的类必须是抽象类,虚方法可以在任何类里;

2.抽象方法必须被重写,虚方法的重写有选择性;

3.抽象方法不可以被子类调用,虚方法可以被子类调用;

4.抽象方法不可以有方法体,虚方法必须有方法体

C#抽象类接口孩子间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意。其实,两者之间还是有很大区别的。

首先说一下接口与抽象类的异同:

相同点:

1.他们都不能实例化自己,也就是说都是用来被继承的。

2.抽象类中的抽象方法和接口方法一样,都不能有方法体

不同点:

1.抽象类里可以有字段,接口中不能有字段.

2.抽象类中的普通方法可以有方法体,而接口方法没有方法体。

3.接口中的方法不能有访问修饰符,抽象类中的抽象方法被继承,需要override重写 .

4.接口更像是一种规范,一种约束。

5.一个子类只能继承一个抽象类,但却可以继承多个接口。

接下来是抽象方法和虚方法的异同:

其实可以把抽象方法看做是没有方法体的虚方法。

相同点:

1.抽象方法和虚方法都可以被重写。

不同点

1.abstract 和virtual的关键字不同

2.抽象方法一定没有方法体,而虚方法可以有方法体。

下面写个例子说明一下:

  1. /// <summary>
  2. /// 一个手机的抽象类
  3. /// </summary>
  4. public abstract class Mobilephone
  5. {
  6. private string _logo;
  7. public string Logo
  8. {
  9. get { return _logo; }
  10. set { _logo = value; }
  11. }
  12. public abstract void Call();
  13. public virtual void Callagain()
  14. {
  15. Console.WriteLine("我再打一个电话");
  16. }
  17. }
  18. /// <summary>
  19. /// 定义一个实体类,继承了一个抽象类及多个接口
  20. /// </summary>
  21. public class Nokia :Mobilephone,IClock,Ilistenmusic
  22. {
  23. public override void Call()
  24. {
  25. Console.WriteLine("NOKIA打电话没问题");
  26. }
  27. public void clock()
  28. {
  29. Console.WriteLine("NOKIA的手机也有闹钟功能");
  30. }
  31. public void listenmusic()
  32. {
  33. Console.WriteLine("NOKIA的手机还能听歌");
  34. }
  35. public override void Callagain()
  36. {
  37. Console.WriteLine("算了,还是不打了");
  38. }
  39. }
  40. /// <summary>
  41. /// 下面定义了两个接口,为了说明可以继承多个接口
  42. /// </summary>
  43. public interface Ilistenmusic
  44. {
  45. void listenmusic();
  46. }
  47. public interface IClock
  48. {
  49. void clock();
  50. }

在补充一个小例子,

这里有到很有意思的面试题,说名了new关键字和override的区别:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. B5 b5 = new B5();
  6. b5.MethodB();
  7. }
  8. }
  9. public class A5
  10. {
  11. public virtual void MethodA()
  12. {
  13. Console.WriteLine("A5.MethodA");
  14. Console.Read();
  15. }
  16. public virtual void MethodB()
  17. {
  18. MethodA();
  19. }
  20. }
  21. public class B5 :A5
  22. {
  23. public new void MethodA()
  24. {
  25. Console.WriteLine("B5.MethodA");
  26. Console.ReadLine();
  27. }
  28. }
  29. class Program
  30. {
  31. static void Main(string[] args)
  32. {
  33. B5 b5 = new B5();
  34. b5.MethodB();
  35. }
  36. }
  37. public class A5
  38. {
  39. public virtual void MethodA()
  40. {
  41. Console.WriteLine("A5.MethodA");
  42. Console.Read();
  43. }
  44. public virtual void MethodB()
  45. {
  46. MethodA();
  47. }
  48. }
  49. public class B5 :A5
  50. {
  51. public new void MethodA()
  52. {
  53. Console.WriteLine("B5.MethodA");
  54. Console.ReadLine();
  55. }
  56. }

最后的答案是:"A5.MethodA"

时间: 2024-10-07 12:22:51

接口 抽象类 虚方法 三者比较-1的相关文章

C#.NET里面抽象类,接口,虚方法

1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 (4) 具体派生类必须覆盖基类的抽象方法 (5) 抽象派生类可以覆盖基类的抽象方法,也可以不覆盖.如果不覆盖,则其具体派生类必须覆盖它们.如: using System; public abstract class A //抽象类A { private int num=0; public

C#基础-接口 抽象方法 虚方法

一:接口 1:类是单继承,接口是多继承. 2:接口中不能有属性,不能有方法体. 3:接口不能被实例化,只能被继承. 4:接口中的所有定义,必须在子类中全部实现. 二:抽象方法 1:含有抽象方法的类,是抽象类. 2:抽象类不能被实例化,只能被继承. 3:抽象方法不能有方法体. 4:抽象方法必须在子类中重写. 5:抽象类可以包含功能实现. 6:抽象方法是可以看成是没有实现体的虚方法 三:虚方法 1:虚方法必须有方法体,可以被重写. 2:修饰方法.属性.索引器或事件

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

虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,并为派生类提供了重写该方法的选项.抽象方法没有提供实现部分,抽象方法是一种强制派生类重写的方法,否则派生类将不能被实例化 2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写.虚方法不是也不必要重写.其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的 3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚拟方法不必.抽象方法不能声明方法体,而虚拟方法可以. 包含抽象方法的类不能实例化 ,

虚方法,多态,抽象方法和接口

虚方法 1.在父类中的虚方法有默认的实现 2.子类可以重写父类的虚方法override 多态   LSP(里氏替换原则) 父类变量 指向 子类对象 抽象方法 1.没有方法体 2.必须在抽象类中 3.子类必须重写抽象方法,除非子类也是一个抽象类 4.抽象类不能实例化 5.抽象成员的访问修饰符不能private 6.子类不能通过base关键字去调用父类的抽象方法 接口: 1.接口是一个特殊的抽象类. 2.属性 方法 索引器 时间 3.接口成员不能添加访问修饰符 4.现接口的类 必须要实现接口中的所有

大龙的学习笔记之“虚方法,抽象方法,重写,抽象类,接口”

虚方法:可以重写,也可以不重写,英文名:virtual 抽象方法:必须重写,必须放在抽象类中,英文名:abstract 重写:可以重写三种方法:virtual,abstract,override,英文名:override 抽象类:可以有抽象方法,也可以有非抽象方法,英文名:abstract 接口:和抽象类相似,但是里面只有未实现的方法,英文名:interface 大龙的学习笔记之"虚方法,抽象方法,重写,抽象类,接口",布布扣,bubuko.com

多态—虚方法、抽象类、接口

修饰符:public : 公共的,引用命名空间即可随意访问,访问权限最高:private : 私有的,只有在声明它的类和结构中才可以访问,访问权限最低: Internal : 内部的,同一个程序集中所有的类都可以访问,程序集就是命名空间, 访问权限次最高,这个访问修饰符是默认的:Protected : 受保护的,只能在他自己和自己的子类中才能访问. --------------------------------------------------------------------------

浅谈接口、抽象类、抽象方法和虚方法的区别

C#抽象类和接口孩子间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意.其实,两者之间还是有很大区别的. 首先说一下接口与抽象类的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方

多态,虚方法重写,抽象类,接口

简而言之就是龙生九子,各有不同 有了继承,才有了多态 1.虚方法 virtual重写 override 父类中的方法,在子类中并不适用,那么子类需要自主更改继承的方法或者是属性,那父类中加了virtual关键字的方法才可以被子类重写 子类重写父类的方法使用的是override关键字 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 多态 { public

抽象类、虚方法、接口的区别

接口 1.接口只提供方法规约,不提供方法体: 2.接口中的方法不能用关键字修饰: 3.接口里不能有接口和变量: 4.接口里的方法在子类中必须全部实现: 5.接口可以实现多重继承: 抽象类 1.抽象类可以从接口继承: 2.抽象类中的实体方法在子类中不可以重写,只可以被引用: 3.抽象类中的抽象方法不可以有方法体,抽象类中的抽象方法在子类中必须重写: 4.抽象类中的虚方法在子类中可以选择性的重写: 虚方法 1.可以在子类选择性的重写: 2.不重写也可被子类调用: 接口与抽象类的异同 1.抽象类的抽象