Unity 收藏本版 已有9人收藏 +发表新主题
查看: 26890|回复: 0
打印 上一主题 下一主题

[分享] 关于abstract和virtual的异同

[复制链接]

[分享] 关于abstract和virtual的异同

xieyoulong 发表于 2016-6-23 12:55:12 浏览:  26890 回复:  0 只看该作者 复制链接
本帖最后由 xieyoulong 于 2016-6-23 12:57 编辑

最近在看到抽象函数时候遇到了abstrack和virtual这两个关键字,这里跟大家分享一下经验,希望各位能用到。

virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义。

它们有一个共同点:如果用来修饰方法,前面必须添加public,虚拟方法或抽象方法是不能私有的。毕竟加上virtual或abstract就是让子类重新定义的,而private成员是不能被子类访问的。


1. abstract 修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。在类声明中使用abstract修饰符以指示某个类只能是其他类的父类。
(1)抽象类具有以下特性:
1) 抽象类不能实例化。
2) 抽象类可以包含抽象方法和抽象访问器。
3) 不能用 sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用 sealed 修饰符的类无法继承,而 abstract 修饰符要求对类进行继承。
4) 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
5) 在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
(2)抽象方法具有以下特性:
1) 抽象方法是隐式的虚方法。
2) 只允许在抽象类中使用抽象方法声明。
3) 因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。
(3)在抽象方法声明中使用 static 或 virtual 修饰符是错误的。除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用abstract修饰符是错误的。在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
  1. public abstract class parent

  2. {

  3. protected int x=100;

  4. protected int y = 200;

  5. public abstract void function();

  6. public abstract int X { get; }

  7. public abstract int Y { get; }

  8. }

  9. public class newperson : parent

  10. {

  11. public override void function()

  12. {

  13. x++;

  14. y++;

  15. }

  16. public override int X

  17. {

  18. get { return x+100; }

  19. }

  20. public override int Y

  21. {

  22. get { return y+100; }

  23. }

  24. }
复制代码
2. virtual关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。虚拟成员的实现可由派生类中的重写成员更改。调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。默认情况下,方法是非虚拟的。不能重写非虚方法。virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。和抽象方法的相同点是都用了override关键字进行重写方法,不同点是抽象方法必须存在于抽象类中,而子类必须重写,除非子类也是抽象的。
  1. class A
  2. {
  3.    public virtual void anim(){}
  4. }
  5. class B:A
  6. {
  7.    public override void anim(){}
  8. }
复制代码



分享至:
| 人收藏
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.