0

我在使用这段代码时遇到了问题:

List<Person> persons;    

foreach(var p in persons)
    p.Save();

有几个类派生自Person所有这些类,它们都有自己的new Save()方法。不幸的是,上面的代码只调用了基类的保存方法,尽管列表包含不同类型的实例(基类和派生类)。

所有派生类都包含所有基类的字段,只是Save方法不同,因此它还保存了派生类的字段。

如何Save根据当前迭代的变量类型使该循环调用适当的方法?

4

3 回答 3

6

方法隐藏通常是灾难的根源。这种场景的正确实现将在类中声明Save()为 as并在派生类中声明。virtualPersonoverride

要使其在您的情况下如上所述工作,您需要转换p为适当的派生类并调用Save()它。根据您对对象的了解或不了解,您可能需要动态确定派生类型并Save()使用反射调用其方法。

于 2013-09-24T02:11:31.973 回答
1

另一种方式,使用反射

List<Person> persons;    

foreach(var p in persons)
    p.GetType().GetMethod("Save").Invoke(p, null);

反射有点慢如果您可以将 save 方法的声明更改为 virtual 并在其他类中覆盖它,这将是比 lc 的答案更好的选择。

于 2013-09-24T02:13:29.213 回答
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();
        }
    }
}
于 2013-09-24T02:17:39.947 回答