2015-08-27 73 views
-5

我已經創造了基礎同名方法和派生類,我能夠創造爲什麼需要使用虛擬和覆蓋?

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

您需要重寫,因爲在您的繼承類中,您更改了'CalculateArea'方法的輸出。 – gh0st

回答

1

如果你不使用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(); 

將輸出

Derived.DoSomething

0

當重寫時,在最派生類的方法被調用。觀察這個稍微修改過的代碼,我分配了兩個程序實例。一個從計劃和一個從程序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(); 
    } 
} 

OUTPUT:

而現在,觀察非虛:

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

輸出

0

首先您需要了解虛擬方法。

  • 基本上虛擬方法是一種可以在 派生類中重新定義的方法。虛擬方法在基類 中有一個實現以及派生類。

: 我們假設我們有兩個類,A和B類有一個名爲測試一個公共的虛擬方法。與此同時,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

爲什麼你需要使用虛擬方法?: 您的程序的設計方式可能使您不知道在執行時會發生的所有對象類型。您可以提供圍繞該類型的標準(基本)類型和設計。 然後,您可以根據更具體(派生)的類型重新實現重要的功能。當您調用基類型的方法時,您會調用更多派生(且有用)的方法。