为什么需要使用虚拟和覆盖

本文关键字:虚拟 覆盖 为什么 | 更新日期: 2023-09-27 18:10:19

我在基类和派生类中创建了相同名称的方法,并且我能够创建

class Program
{
    public void CalculateArea(int a,int b)
    {
        Console.WriteLine(a*b);
    }
}
class progrmm1:Program
{
    public void CalculateArea(int a ,int b)
    {
        Console.WriteLine(a + b);
    }
    static void Main(string[] args)
    {
        progrmm1 obj = new progrmm1();
        Program obj1 = new Program();
        obj.CalculateArea(4,5);
        obj1.CalculateArea(4,5);
        Console.ReadLine();
    }   
}

那么为什么我需要使用虚拟和覆盖

为什么需要使用虚拟和覆盖

如果不使用virtualoverride,那么就没有利用多态性。基本上,派生类中的CalculateArea隐藏了基类中的一个。这意味着,如果引用派生类类型的对象作为基,它将调用基类中的CalculateArea,而不是派生类。其中,就像使用virtualoverride一样,它会调用Derived方法,即使它被引用为Base。

例如,对于这些类

public class Base
{
    public void DoSomething()
    {
        Console.WriteLine("Base.DoSomething");
    }
}
public class Derived : Base
{
    public void DoSomething()
    {
        Console.WriteLine("Derived.DoSomething");
    }
}

此代码

Base derivedAsBase = new Derived();
derivedAsBase.DoSomething();

将输出

Base.DoSomething

但使用virtualoverride

public class Base
{
    public virtual void DoSomething()
    {
        Console.WriteLine("Base.DoSomething");
    }
}
public class Derived : Base
{
    public override void DoSomething()
    {
        Console.WriteLine("Derived.DoSomething");
    }
}

相同的代码

Base derivedAsBase = new Derived();
derivedAsBase.DoSomething();

将输出

衍生.DoSomething

重写时,调用派生类最多的方法。观察一下这个稍微修改过的代码,我在其中分配了两个Program实例。一个来自一个程序,一个来自程序1:

class Program
{
    public virtual void CalculateArea(int a, int b)
    {
        Console.WriteLine(a * b);
    }
}
class progrmm1 : Program
{
    public override void CalculateArea(int a, int b)
    {
        Console.WriteLine(a + b);
    }
    static void Main(string[] args)
    {
        Program obj = new progrmm1();
        Program obj1 = new Program();
        obj.CalculateArea(4, 5);
        obj1.CalculateArea(4, 5);
        Console.ReadLine();
    }
}

输出:

9

20

现在,观察非虚拟:

class Program
{
    public void CalculateArea(int a, int b)
    {
        Console.WriteLine(a * b);
    }
}
class progrmm1 : Program
{
    public void CalculateArea(int a, int b)
    {
        Console.WriteLine(a + b);
    }
    static void Main(string[] args)
    {
        Program obj = new progrmm1();
        Program obj1 = new Program();
        obj.CalculateArea(4, 5);
        obj1.CalculateArea(4, 5);
        Console.ReadLine();
    }
}

输出

20

20

首先您需要了解虚拟方法。

  • 基本上,虚拟方法是一种可以在派生类。虚拟方法在基中具有实现类以及派生该类

示例:假设我们有两个类,A和B。类A有一个名为Test的公共虚拟方法。同时,类B派生自类A,它还提供了一个名为Test的公共重写方法。

using System;
class A
{
    public virtual void Test()
    {
       Console.WriteLine("A.Test");
    }
}
class B : A
{
    public override void Test()
    {
      Console.WriteLine("B.Test");
    }
}
class Program
{
     static void Main()
     {
       // Compile-time type is A.
       // Runtime type is A as well.
       A ref1 = new A();
       ref1.Test();
       // Compile-time type is A.
       // Runtime type is B.
       A ref2 = new B();
       ref2.Test();
     }
}

输出

  • A.测试

  • B.测试

为什么需要使用虚拟方法:程序的设计方式可能会使您不知道执行程序时将出现的所有对象类型。您可以提供标准(基本(类型并围绕该类型进行设计。然后,您可以根据更具体的(派生的(类型重新实现重要的功能。当您在基类型上调用一个方法时,您会调用更派生(更有用(的方法。