zoukankan      html  css  js  c++  java
  • 面向对象关键字-new virtual override base

    virtual 虚拟的

    virtual标记的方法或属性,本质上是在内存空间中做了定义,但其对应的地址是不固定的,是在运行时根据规则来判定的。

    A类 对象名=new B类(),A类叫做申明类,B类叫做实例类

    规则:

    1 当调用方法时,先检查在申明类中该方法是否是virtual,如果不是虚方法则直接执行,如果是虚方法则需检查实例类。

    2 在实例类中检查是否有override该方法,如果有则直接调用该方法,如没有则在其父类中逐级查找,直到找到第一个override方法。

     

    注意virtual标记的方法被override,override的方法也是virtual的

     

    代码小练习

     1 class People
     2 {
     3     public virtual void SayHi()
     4     {
     5         Console.WriteLine("打招呼!");
     6     }
     7 }
     8 
     9 class Student:People
    10 {
    11     public override void SayHi()
    12     {
    13         Console.WriteLine("学生好!");
    14     }
    15 }
    16 
    17 class Teacher:People
    18 {
    19     public new void SayHi()
    20     {
    21         Console.WriteLine("老师好!");
    22     }
    23 }
    24 
    25 class XY:Student
    26 {
    27 }
    28 static void Main(string[] args)
    29 {
    30     People p0 = new People();
    31     People p1 = new Student();
    32     People p2 = new Teacher();
    33     People p3 = new XY();
    34     
    35     p0.SayHi();
    36     p1.SayHi();
    37     p2.SayHi();
    38     p3.SayHi();
    39     Console.ReadKey();
    40 }
    View Code

    代码分析:

    p0.SayHi();p0申明类和实例类都是Person 输出 打招呼!

    p1.SayHi();p1实例类是Student,重写了申明类Person的SayHi方法,输出 学生好

    p2.SayHi();p2实例类是Teacher,没有重写,父类Person虚方法,输出 打招呼!

    P3.SayHi();p3实例类是XY,XY中没有重写,父类Student中重写了,输出 学生好

     

    new

    new关键在在面向对象中,有两种功能,其一是调用构造方法,创建对象,开辟空间

    另一是覆盖基类的方法或属性

    new 和override的区别

    1 两个关键字都是用于继承中

    2 override 只能用于virtual abstract override修饰的方法或属性

    3 new 可用于非abstract,非override修饰的方法或属性,调用时取决于申明类的类型

    不用new也能构成覆盖。

    Base

    调用基类方法(构造方法和其他方法)

     1 class People 
     2 {
     3     public string Name { get; set; }
     4     
     5     public People()
     6     {
     7     }
     8 
     9     Public People(string nane)
    10     {
    11         this.Name = name;
    12     }
    13     
    14     public virtual void SayHi()
    15     {
    16         Console.WriteLine("{0},你好!",);
    17     }
    18 }
    19 
    20 class Student:People
    21 {
    22     public Student()
    23     {
    24     }
    25     
    26     public Student(string name):base(name)
    27     {
    28     }
    29     
    30     public override void SayHi()
    31     {
    32         base.SayHi();
    33     }
    34 }
    View Code
  • 相关阅读:
    《Java从入门到放弃》入门篇:springMVC数据校验
    《Java从入门到放弃》入门篇:springMVC数据传递 (二)
    《Java从入门到放弃》入门篇:springMVC数据传递
    《Java从入门到放弃》入门篇:springMVC基本用法
    《Java从入门到放弃》入门篇:spring中AOP的配置方式
    《Java从入门到放弃》入门篇:spring中IOC的注入姿势
    《Java从入门到放弃》入门篇:Struts2的拦截器基本语法
    《Java从入门到放弃》入门篇:Struts2的常用验证方式(二)
    26计算限制的异步操作02-CLR
    26计算限制的异步操作01-CLR
  • 原文地址:https://www.cnblogs.com/arvinzd/p/14207222.html
Copyright © 2011-2022 走看看