2013-05-29 46 views
-1

我有這些2類:呼叫基地方法作爲鹼型

public class A 
{ 
    public void ShowType() 
    { 
     Console.WriteLine(GetType().ToString()); 
    } 
} 

public class B : A 
{ 

} 

和該主代碼:

static void Main(string[] args) 
{ 
    B b = new B(); 

    b.ShowType(); 

    Console.ReadLine(); 
} 

現在,輸出爲 「 B的」。有沒有辦法從B實例調用ShowType()方法作爲A實例?這樣的輸出將是「類型 A」?

謝謝。

+1

這是你的功課? –

+0

不,這是我在工作中遇到的問題的簡化代碼。我們有一個我們想要繼承的第三方類,但是當我們調用一個基本方法時,會發生一些反射,並且它抱怨它不能識別新的派生類型。 –

+0

難道你不能只做一個基類的實例嗎? –

回答

2

假設你不是指聲明ShowType virual之類的東西並覆蓋它,基本上沒有。 GetType()是非虛擬的,並且始終返回對象的實際運行時類型。

3

如果你要退出,如果多態性在這裏,你可以簡單地使用typeof(A).ToString()

public class A 
{ 
    // Will always output "type of A" 
    public void ShowType() 
    { 
     Console.WriteLine(typeof(A).ToString()); 
    } 
} 

如果你不能改變的A的代碼,你只需要重寫ShowType的可能性。但是,爲了這個工作,它需要是virtual

但是,根據您對該問題的評論,您實際上並不希望ShowType輸出"type of A"。無論實例的實際類型是什麼,您都希望GetType()返回typeof(A)
你倒黴了,這是不可能的。

您可能想在這裏考慮偏好合成而不是繼承,而不是從該基類派生,而是讓您的類使用該基類的實例。

+0

我不想只寫基本類型,我想調用基本方法作爲基本實例。這是個問題。示例中的方法只是寫入類型來演示它被稱爲派生類型。 –

+2

@ViorelMoisei:請提供一個真實世界的例子。你的句子*「我想調用基本方法作爲基礎實例」*沒有意義,真的:) –

+0

正如我上面評論的那樣,這是我在工作中遇到的問題的簡化代碼。我們有一個我們想要繼承的第三方類(這將是我的例子中的「A」),但是當我們從派生類調用基本方法(我的例子中的「B」)時,會發生一些反射,抱怨說它不能識別新的派生類型。所以我想能夠調用基類第三方類(「A」)的方法作爲基類(「A」),所以當他們做出反思時,他們可以看到它是他們的類型(「A」), ,不是我的(「B」) –

0

試試這個:

Console.WriteLine(this.GetType().BaseType.ToString()); 

當然,這將返回System.ObjectbA類實例。

+0

我不想要爲了只寫基類型,我想調用一個基類方法作爲基類實例,這是一個問題,例子中的方法只是寫這個類型來證明它被稱爲派生類型。 –

0

這是你的條件

首先,你不想修復你的基本代碼。第二,你通過B實例調用ShowType()。 所以,這就是我的回答

這是我的代碼

static void Main(string[] args) 
{ 

    B b = new B(); 
    Type aType = b.Gettype().BaseType; //this is that get A through B class 
    ((a)Activator.CreateInstance(atype)).ShowType(); //call ShowType of A class 

}