2013-05-29 41 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 

}