类重写

01.override
在这里插入图片描述


    class Program
    {
        static void Main(string[] args)
        {
            Controller controller=new SubClass();
            ReadKey();
        }
    }

    class Controller
    {
        public Controller()
        {
            Run();
        }
        public void Start()
        {
            Console.WriteLine("Start");
        }

        private void Run()
        {
            Start();
            InternalRun();
            Stop();
        }

        public void Stop()
        {
            Console.WriteLine("Stop");
        }

        protected virtual void InternalRun()
        {
            Console.WriteLine("ControllerInternalRun");
        }

    }


    class SubClass:Controller
    {
        protected override void InternalRun()
        {
            Console.WriteLine("SubClassInternalRun");
        }
    }


在这里插入图片描述
02.new 加上new关键字的属性或函数将对本类和继承类隐藏基类的同名属性或函数

new和overrid的区别
01.当子类构造父类时,调用的是父类的构造方法
在这里插入图片描述

  class Program
    {
        static void Main(string[] args)
        {
            A a =new B(); //A只认识类B中继承于类A的Method函数,也就是它本身的方法,对于B类中的Method它不可见
            a.Method(); //this Method in Class A! 调用了类B中继承于A的Method函数
            ReadKey();
        }
    }

    public class A
    {
        public virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public new void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }
    }

在这里插入图片描述
02.override关键字表示重写,对于加上override关键字的属性或函数将完全覆盖基类的同名虚属性或虚函数
使基类的虚属性和虚函数在整个继承链中都不可见(在子类中用base关键字调用除外)

在这里插入图片描述


 //B的Method函数完全覆盖基类的同名虚函数Method,使整个继承链中看见的Method函数都是B中的Method,所以就算是以A角度来看B,A看到的Method函数也是           //B中的Method,因为A中的Method完全被B的覆盖了
 class Program
    {
        static void Main(string[] args)
        {
            A a =new B();
            a.Method(); //this Method in Class B! 调用了类B的Method函数

            ReadKey();
        }
    }

    public class A
    {
        public virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public override void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }
    }

   

03.如果要在B的对象中调用A的Method函数还是有办法,就是使用base关键字

class Program
    {
        static void Main(string[] args)
        {
            A a =new B();
            a.Method(); ///this Method in Class B this Method in Class B! 调用了类A和B的Method函数

            ReadKey();
        }
    }

    public class A
    {
        public virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public override void Method()
        {
            base.Method();
            Console.WriteLine("This Method in Class B!");
        }
    }

04.sealed
在这里插入图片描述

 public class A
    {
        public  virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public sealed override void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }
    }

    public class C : B
    {
        
    }

05.构造器
在这里插入图片描述

 class Program
    {
        static void Main(string[] args)
        {
            A a =new B();
            a.Method();
            ReadKey();
        }
    }

    public class A
    {
        //首先访问的是基类A的构造器
        public A()
        {
            Console.WriteLine("A");
        }
        public  virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public  override void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }

       
    }

在这里插入图片描述
当基类没有可以访问的构造器时候
在派生类中要显式指定基类的构造器

 class Program
    {
        static void Main(string[] args)
        {
            A a =new B(2);
            a.Method();
            ReadKey();
        }
    }

    public class A
    {
        private int a;
        public A(int a)
        {
            this.a = a;
        }
        public  virtual void Method()
        {
            Console.WriteLine("This Method in Class A!");
        }
    }

    public class B : A
    {
        public B(int a) : base(a)
        {
        }
        public  override void Method()
        {
            Console.WriteLine("This Method in Class B!");
        }
    }

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值