问题描述
考虑以下代码:
using System;
public class Program
{
public static void Main()
{
A m1 = new B();
B m2 = new B();
Console.Write("m1: ");
m1.fun();
Console.Write("m2: ");
m2.fun();
}
}
abstract class A
{
public abstract void fun ();
}
class B : A
{
public override void fun()
{
if (this.GetType() == typeof(A)) // ????
Console.WriteLine("A");
else Console.WriteLine("B");
}
}
我希望您修改if
语句,以便程序为A
写m1
,为B
写m2
。
我一直在尝试与GetType()
,typeof
,is
和as
进行各种组合,但无法完成这项工作。
解决方法
我不确定您的分配规则是什么,但是如果您在基类中有一个虚拟方法并在派生类中重写它,那么您总是会得到“ B”。
如果允许您更改类型的继承,则可以执行以下操作:
public class Program
{
public static void Main()
{
A m1 = new B();
B m2 = new B();
Console.Write("m1: ");
m1.Fun();
Console.Write("m2: ");
m2.Fun();
// m1: A
// m2: B
}
}
abstract class A
{
public void Fun() => Console.WriteLine("A");
}
class B : A
{
public new void Fun() => Console.WriteLine("B");
}
,
不是虚拟方法,而是通用方法解析仅使用编译时类型信息,因此可以使用它。您可能会定义以下扩展方法:
public static class Extensions
{
public static void Fun<T>(this T instance)
{
Console.WriteLine(typeof(T).Name);
}
}
并像现在调用虚拟方法一样调用它:
m1.Fun();