-1

我有这两个类:

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类型”?

谢谢。

4

4 回答 4

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)

您可能想在这里考虑优先组合而不是继承,并且不要从该基类派生,而是让您的类使用该基类的实例。

于 2013-05-29T07:05:59.863 回答
2

假设您的意思不是像声明ShowType病毒并覆盖它,基本上,没有。GetType()是非虚拟的,总是返回对象的实际运行时类型。

于 2013-05-29T07:04:39.590 回答
0

尝试这个:

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

当然,这将返回System.Objectwhenb是一个A类实例。

于 2013-05-29T07:08:11.107 回答
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

}
于 2013-05-29T08:03:25.187 回答