闪电龟龟--笔记

万物寻其根,通其堵,便能解其困。
  博客园  :: 新随笔  :: 管理

C# 虚方法、override和new

Posted on 2019-01-13 20:14  闪电龟龟  阅读(706)  评论(0编辑  收藏  举报

使用new关键字来做调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        public class Aminal
        {
            public string Name;  // 定义宠物的名字
            public void PrintName()
            {
                Console.WriteLine("宠物的名字:" + Name);
            }
        }
        // Dog继承Aminal类
        public class Dog : Aminal
        {
            // 隐藏父类的PrintName
            new public void PrintName()
            {
                Console.WriteLine("名字为:" + Name);
            }
        }
        static void Main(string[] args)
        {
            // 使用new关键字隐藏,取决于通过什么类型的调用
            //Dog dog = new Dog();  // 打印的是使用Dog里面的PrintName的方法
            Aminal dog = new Dog();  // 调用的是Aminal里面的PrintName的方法
            dog.Name = "your name";
            dog.PrintName();
        }
    }
}

使用vitual虚方法和override重写

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        public class Aminal
        {
            public string Name;  // 定义宠物的名字
            // 定义虚方法
            virtual public void PrintName()
            {
                Console.WriteLine("宠物的名字:" + Name);
            }
        }
        // Dog继承Aminal类
        public class Dog : Aminal
        {
            // 重写
            public override void PrintName()
            {
                // base.PrintName(); // 这个是调用父类的虚方法
                Console.WriteLine("这是重写方法,{0}", this.Name);
            }
        }
        static void Main(string[] args)
        {
            Aminal dog = new Dog();  // 输出的是重写方法的内容
            dog.Name = "your name";
            dog.PrintName();
        }
    }
}

 虚方法需要注意的地方:

1.重写虚方法必须要使用相同的可访问属性,如:private就不可以

2.不能重写static和非虚方法

3.方法、属性、索引器、事件都可以使用虚方法重写

 

override:重写父类的方法。

new:用来隐藏父类的方法。

主要区别在于:override不管使用的是父类声明还是子类声明,调用的都是override重写后的方法;new则不一样,如果声明时使用的是父类,那么姜辉调用父类的virtual方法,如果使用的是子类声明,那么调用的是子类new声明的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication3
{
    class OneClass
    {
        public virtual void a_func()
        {
            Console.WriteLine("这是virtual方法...");
        }
    }
    class TwoClass : OneClass
    {
        public override void a_func()
        {
            Console.WriteLine("这是override方法...");
        }
    }
    class ThreeClass : OneClass
    {
        public new void a_func()
        {
            Console.WriteLine("这是new方法...");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // 子类声明
            OneClass a = new OneClass();
            a.a_func();  // 输出"这是virtual方法..."
            TwoClass b = new TwoClass();
            b.a_func();  // 输出"这是override方法..."
            ThreeClass c = new ThreeClass();
            c.a_func();  // 输出"这是new方法..."
            // 上面三种都很容易理解。
            // 关键是下面这两种,父类声明
            OneClass d = new TwoClass();
            d.a_func();  // 输出"这是override方法..."
            OneClass e = new ThreeClass();
            e.a_func();  // 输出"这是virtual方法..."
            Console.ReadKey();
        }
    }
}