栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

virtual在C#中的用法

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

virtual在C#中的用法

Virtual表示虚拟的含义但在C#中默认的成员是非虚拟的,通常将类中的成员定义为虚拟的,表示这些成员在继承后 可以被重写其中的内容

 

Virtual关键字可以修饰方法、属性、索引器 以及事件等用到父类的成员中

使用Virtual 关键字修饰属性和方法的语法形式如下

//修饰属性

Public virtual 数据类型 属性名 {get;set;}

//修饰方法

访问修饰符 virtual 返回值类型方法

{

语句块

}

例子:
 

  1. class Person
  2. {
  3. public virtual void Print()
  4. {
  5. Console.WriteLine("编号:"+ Id);
  6. Console.WriteLine("姓名:"+ Name);
  7. Console.WriteLine("性别:"+ Sex);
  8. Console.WriteLine("身份证号:"+ Cardid);
  9. Console.WriteLine("联系方式:"+ Tel);
  10. }
  11. }
  12.  
  13. class Student:Person
  14. {
  15. public override void Print()
  16. {
  17. Console.WriteLine("编号:"+ Id);
  18. Console.WriteLine("姓名:"+ Name);
  19. Console.WriteLine("性别:"+ Sex);
  20. Console.WriteLine("身份证号:"+ Cardid);
  21. Console.WriteLine("联系方式:"+ Tel);
  22. Console.WriteLine("专业:"+ Major);
  23. Console.WriteLine("年级:"+ Grade);
  24. }
  25. }
  26.  
  27. class Teacher:Person
  28. {
  29. public override void Print()
  30. {
  31. Console.WriteLine("编号:"+ Id);
  32. Console.WriteLine("姓名:"+ Name);
  33. Console.WriteLine("性别:"+ Sex);
  34. Console.WriteLine("身份证号:"+ Cardid);
  35. Console.WriteLine("联系方式:"+ Tel);
  36. Console.WriteLine("专业:"+ Major);
  37. Console.WriteLine("年级:"+ Grade);
  38. }
  39. }

但对于以上代码 需要消除代码冗余,在这使用base  关键字调用父类的print方法。

例子:
 

  1. class Student:Person
  2. {
  3. public override void Print()
  4. {
  5. base.Print ();
  6. Console.WriteLine("专业:"+ Major);
  7. Console.WriteLine("年级:"+ Grade);
  8. }
  9. }
  10. class Teacher:Person
  11. {
  12. public override void Print()
  13. {
  14. base.Print ();
  15. Console.WriteLine("专业:"+ Major);
  16. Console.WriteLine("年级:"+ Grade);
  17. }
  18. }

 

方法隐藏和方法重写 之间的区别

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. A a1 = new B();
  6. a1.Print();
  7. A a2 = new C();
  8. a2.Print();
  9. }
  10. }
  11. class A
  12. {
  13. public virtual void Print()
  14. {
  15. Console.WriteLine("A");
  16. }
  17. }
  18. class B :A
  19. {
  20. public new void Print()
  21. {
  22. Console.WriteLine("B");
  23. }
  24. }
  25. class C :A
  26. {
  27. public override void Print()
  28. {
  29. Console.WriteLine("C");
  30. }
  31. }

执行上面的代码,效果如下图所示。
 


从上面的执行效果可以看出,使用方法隐藏的方法调用的结果是父类 A 中 Print 方法中的内容,而使用方法重写的方法调用的结果是子类 C 中 Print 方法中的内容。

因此方法隐藏相当于在子类中定义新方法,而方法重写则是重新定义父类中方法的内容。

从上面的代码也可以看出,在“A a1=new B()”语句中 A 类是父类、B 类是子类,相当于将子类转换成父类,即隐式转换。

如果需要将父类转换成子类,则需要强制转换,并且在强制转换前需要先将所需的子类转换成父类,示例代码如下。

  1. A a2=new C();
  2. C c=(C) a2;
  3. c.Print();

在上面的实例中,a2 是父类对象,然后将其强制转换成 C 类对象。

Object 类中的 ToString 方法能被类重写,并返回所需的字符串,通常将其用到类中返回类中属性的值。

在 Student 类中添加重写的 ToString 方法,代码如下。

  1. class Student
  2. {
  3. public string Major{ get; set;}
  4. public string Grade{ get; set;}
  5. public void Print()
  6. {
  7. Console.WriteLine("专业:"+ Major);
  8. Console.WriteLine("年级:"+ Grade);
  9. }
  10. public override string ToString()
  11. {
  12. return Major+","+Grade;
  13. }
  14. }

这样,在调用 Student 类中的 ToString 方法时即可获取专业和年级的值。

此外,除了 ToString 方法,在类中也可以重写 Equals 方法、GetHashCode 方法。

 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/904370.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号