我有这两个班级:
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的类型?”
感谢。
答案 0 :(得分: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)
你在那里运气不好,这是不可能的。
你可能想在这里考虑使用组合优于继承,而不是从该基类派生,而是让你的类使用该基类的实例。
答案 1 :(得分:2)
假设你并不意味着声明ShowType
虚假而且覆盖它,基本上没有。 GetType()
是非虚拟的,并且始终返回对象的实际运行时类型。
答案 2 :(得分:0)
试试这个:
Console.WriteLine(this.GetType().BaseType.ToString());
当然,当System.Object
是b
类实例时,这将返回A
。
答案 3 :(得分: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
}