2010-10-21 180 views
1

我有一些代碼來實現在C#接口實現與繼承在C#

public interface Intfc { void xyz();} 

public class BaseClass : Intfc 
{ 

    public virtual void xyz() 
    { 
     Console.WriteLine("In Base Class"); 
    } 
} 

public class Derived : BaseClass 
{ 
    public override void xyz() 
    { 
     Console.WriteLine("In Derived Class"); 
    } 
} 

static void Main(string[] args) 
    { 
     Derived mc = new Derived(); 
     mc.xyz(); //In Derived Class 
     ((BaseClass)mc).xyz(); //In Base Class 
     ((Intfc)mc).xyz(); //In Derived Class 

     Console.ReadKey(); 

    } 

接口,我需要在控制檯輸出爲Main()中發表了。 實際結果爲

In Derived Class 
In Derived Class 
In Derived Class 

我該如何達到預期的效果。

+0

這是設計。你能給我們一個真實世界的例子嗎? – 2010-10-21 08:23:02

回答

1

您需要覆蓋Derived類上的方法,而不是使用virtual/override操作符使用new運算符。

http://msdn.microsoft.com/en-us/library/51y09td4(VS.71).aspx#vclrfnew_newmodifier

嘗試

public interface Intfc { void xyz();} 

public class BaseClass : Intfc 
{ 
    public void xyz() 
    { 
     Console.WriteLine("In Base Class"); 
    } 
} 

public class Derived : BaseClass 
{ 
    new public void xyz() 
    { 
     Console.WriteLine("In Derived Class"); 
    } 
} 

static void Main(string[] args) 
{ 
    Derived mc = new Derived(); 
    mc.xyz(); //In Derived Class 
    ((BaseClass)mc).xyz(); //In Base Class 
    ((Intfc)mc).xyz(); //In Derived Class 

    Console.ReadKey(); 

} 
+1

這回答了這個問題,但值得注意的是,如果有的話,應該偶爾使用這種'new'。 – 2010-10-21 08:28:16

+0

我同意,但我確定他有一個請求這種行爲的原因:) – 2010-10-21 08:30:34

+0

是的,所需的行爲只是簡單的怪異,無論實施。順便說一下,是否可以重寫非虛擬方法。我懷疑這個代碼不會編譯。 – spender 2010-10-21 08:36:12

0

你不能這樣做,mcDerived的類型,它將始終在本課程中調用xyz。這就是繼承的工作原理。您需要一個BaseClass實例:

var bc = new BaseClass(); 
bc.xyz(); // In Base Class 
+0

downvote的任何原因? downvoting時請留言。 – 2010-10-21 08:35:53

0

您將需要一個var b = new BaseClass()。然後b.xyz()而不是((BaseClass)mc).xyz()

1

不要使用virtual方法與override修改,但重新實現對Derived類的接口。

下面的代碼展示了所需的行爲,但我認爲這種方法對最終用戶有點混淆和不透明。

public interface Intfc { void xyz();} 

public class BaseClass : Intfc 
{ 

    public void xyz() 
    { 
     Console.WriteLine("In Base Class"); 
    } 
} 

public class Derived : BaseClass,Intfc 
{ 
    public void xyz() 
    { 
     Console.WriteLine("In Derived Class"); 
    } 
} 

static void Main() 
{ 
    Derived mc = new Derived(); 
    mc.xyz(); //In Derived Class 
    ((BaseClass)mc).xyz(); //In Base Class 
    ((Intfc)mc).xyz(); //In Derived Class 



} 
0

你很想理解繼承的行爲。

當您創建一個給定類型的對象覆蓋某些虛擬方法您將一直得到該覆蓋方法的結果。鑄造操作不會改變對象結構,一旦創建對象可以改變他的狀態。

static void Main(string[] args) 
    { 
     Intfc mc1 = new Derived(); 
     Intfc mc2 = new BaseClass(); 

      mc1.xyz(); 
      mc2.xyz(); 

     Console.ReadKey(); 

    } 

這將產品

In Base Class 
In Derived Class 

但因爲總有一個,但。

如果您覆蓋這個方法,你會得到的結果是什麼你是最多,覆蓋方法只使用運營商

public class Derived : BaseClass 
{ 
    new public void xyz() 
    { 
     Console.WriteLine("In Derived Class"); 
    } 
} 

public class BaseClass : Intfc 
{ 

    public void xyz() 
    { 
     Console.WriteLine("In Base Class"); 
    } 
} 

這將使用新的實施DeriveClass和舊的BaseClass的。

鏈接:

What override is ?

Modifier new in method signature

What modifier new is ?

0

當您添加改性劑override在MC繼承的虛方法某某,你只需在重載了繼承的虛方法由mc引用的實例。就好像你擦除了Base.xyz並將Derived.xyz寫入了mc實例的內存中。因此,由mc引用的實例在其實現中沒有虛擬xyz的記錄,因此沒有辦法通過mc引用來獲取它。訪問基地的虛擬方法的唯一方法是通過基地的一個實例,如下所示:

var b = new BaseClass();  
b.xyz();// instead of ((BaseClass)mc).xyz()