我遇到了这段代码的问题:
List<Person> persons;
foreach(var p in persons)
p.Save();
有几个派生自Person
的类,所有类都有自己的new Save()
方法。不幸的是,上面的代码只调用基类的save方法,尽管列表包含不同类型的实例(基类和派生类)。
所有派生类都包含所有基类'字段,只有Save
方法不同,因此它还保存派生类'字段。
如何根据当前迭代的变量类型调用适当的Save
方法?
答案 0 :(得分:6)
方法隐藏通常是灾难的一个方法。正确实现此方案会在Save()
类中将virtual
声明为Person
,在派生类中将其override
声明为。{/ p>
如上所述,要使其适用于您的情况,您需要将p
强制转换为相应的派生类,并在其上调用Save()
。根据您对对象的了解或不了解,您可能需要动态确定派生类型并使用反射调用其Save()
方法。
答案 1 :(得分:1)
另一种方式,使用反射
List<Person> persons;
foreach(var p in persons)
p.GetType().GetMethod("Save").Invoke(p, null);
反射位慢如果你可以将save方法的声明更改为虚拟,并在其他类中覆盖它,这将是比lc的答案更好的选择。
答案 2 :(得分:0)
这会调用正确的方法。
using System;
namespace Inheritance
{
class Program
{
public class Person
{
virtual public void Save()
{
Console.WriteLine("Person Save");
}
}
public class Emp : Person
{
override public void Save() {
Console.WriteLine("Emp Save");
}
}
static void Main(string[] args)
{
Person p = new Emp();
p.Save();
}
}
}