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

时间:2015-08-27 20:15:12

标签: c#

我在基类和派生类中创建了相同的名称方法,我可以创建

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();
    }   
}

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

3 个答案:

答案 0 :(得分:1)

如果您不使用virtualoverride,那么您就没有利用多态性。基本上派生类中的CalculateArea隐藏了基类中的CalculateArea。这意味着如果您引用派生类类型的对象作为基础,它将调用基类中的virtual而不是派生类。{1}}。如果您使用overridepublic class Base { public void DoSomething() { Console.WriteLine("Base.DoSomething"); } } public class Derived : Base { public void DoSomething() { Console.WriteLine("Derived.DoSomething"); } } ,即使它被引用为Base,也会调用Derived方法。

例如使用这些类

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

此代码

virtual

将输出

  

Base.DoSomething

但使用overridepublic 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();

相同的代码

dict

将输出

  

Derived.DoSomething

答案 1 :(得分:0)

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

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();
    }
}

输出:

9

20

现在,观察非虚拟:

.more-menu {
    background-color: #111111;
    display: none;
    position: relative;
    top: 0px; /*this was 16px but is now 0px*/
    right: 25px;
    height: 27px;
    width: 475px;
    font: bold 14px sans-serif;
  outline: 1px solid #000000;
    z-index: 11;
}

输出

20

20

答案 2 :(得分:0)

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

  • 基本上虚拟方法是一种可以重新定义的方法 派生类。虚方法在基础中具有实现 类以及派生类。

示例: 假设我们有两个类,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.Test

  •   

    B.Test

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