查看: 176|回复: 0

[.NET源码] 里式转换

发表于 5 天前
太阳http代理AD

里氏转换:

  1. 子类可以赋值给父类 (如果有一个方法需要一个父类作为参数,我们可以 传一个 子类对象)
  2. 如果父类中装的是子类可以强转为子类对象
  3. 子类对象可以调用父类成员,但是父类对象永远只能只能调用父类自己的成员

Person p=new Student();
如果说子类可以赋值给父类 那我们应该声明一个父类类型去指向子类对象
如果说父类中装的是子类对象 可以考虑将父类强转为子类对象用
is 转换成功返回 true
as 转换成功返回对应的对象 来接收ss
students ss =p as students;声明一个students类型的对象
is的用法:
if(p is students)
{
((students)p).studentsSayHello();
}
else
{
cw("失败");
}

  1. 1 namespace _里氏转换
  2. 2 {
  3. 3 class Program
  4. 4 {
  5. 5 static void Main(string[] args)
  6. 6 {
  7. 7 //// 1、里氏转换
  8. 8 ////1)、子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替
  9. 9 // Student s = new Student();
  10. 10 Person p = new Student();//s;
  11. 11
  12. 12 //string str = string.Join("|",new string[] { "1", "2", "3", "4" });
  13. 13 //Console.WriteLine(str);
  14. 14 //Console.ReadKey();
  15. 15
  16. 16 ////2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。
  17. 17
  18. 18 //is的用法
  19. 19 //if (p is Student)
  20. 20 //{
  21. 21 // Student ss = (Student)p;
  22. 22 // ss.StudentSayHello();
  23. 23 //}
  24. 24 //else
  25. 25 //{
  26. 26 // Console.WriteLine("转换失败");
  27. 27 //}
  28. 28 //as的用法
  29. 29 Student t = p as Student;
  30. 30 t.StudentSayHello();
  31. 31 Console.ReadKey();
  32. 32 }
  33. 33 }
  34. 34
  35. 35 public class Person
  36. 36 {
  37. 37 public void PersonSayHello()
  38. 38 {
  39. 39 Console.WriteLine("我是父类");
  40. 40 }
  41. 41 }
  42. 42 public class Student : Person
  43. 43 {
  44. 44 public void StudentSayHello()
  45. 45 {
  46. 46 Console.WriteLine("我是学生");
  47. 47 }
  48. 48 }
  49. 49 public class Teacher : Person
  50. 50 {
  51. 51 public void TeacherSayHello()
  52. 52 {
  53. 53 Console.WriteLine("我是老师");
  54. 54 }
  55. 55 }
  56. 56
  57. 57
  58. 58 }
复制代码



太阳http代理AD
回复

使用道具 举报