我在基类和派生类中创建了相同的名称方法,我可以创建
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();
}
}
然后为什么我需要使用虚拟和覆盖
答案 0 :(得分:1)
如果您不使用virtual
和override
,那么您就没有利用多态性。基本上派生类中的CalculateArea
隐藏了基类中的CalculateArea
。这意味着如果您引用派生类类型的对象作为基础,它将调用基类中的virtual
而不是派生类。{1}}。如果您使用override
和public 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
但使用override
和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();
相同的代码
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
为什么需要使用虚拟方法?: 您的程序可能设计为不知道执行时将出现的所有对象类型。您可以提供围绕该类型的标准(基础)类型和设计。 然后,您可以根据更具体(派生)的类型重新实现重要功能。在基类型上调用方法时,可以调用派生的(并且有用的)方法。