在c#中从泛型引用调用派生类重写方法

本文关键字:派生 重写 方法 调用 引用 泛型 | 更新日期: 2023-09-27 18:14:29

我正在制作一款游戏,这里有一个基本的继承层次:

GameObject是一个基类,有一个叫做Clone的虚方法

PlatformObjectGameObject衍生而来,覆盖Clone方法

我有一个用于任何GameObject或派生的序列化/反序列化泛型类,定义如下:

public class XmlContentReaderBase<T> where T : GameObject

我的XML Reader类不知道我的派生类型。我对这行有一个问题:

        T obj = serializer.Deserialize(input) as T;
        return obj.Clone() as T;

第一行运行良好,并返回正确的PlatformObject。但是第二行调用基类GameObjectClone方法,这不是我想要的。我需要调用PlatformObject.Clone方法,我怎么能做到这一点?

谢谢,可以。

在c#中从泛型引用调用派生类重写方法

我编写了一个与此非常接近的实现,并看到Clone引用派生对象的Clone方法(通过创建一个新对象而不是反序列化一个对象来欺骗)。

发布更多代码?

using System.Text;
namespace GenericExperiment
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlContentReaderBase<PlatformObject>.Deserialize();
            Console.ReadKey();
        }
    }
    class GameObject : ICloneable
    {
        object ICloneable.Clone()
        {
            Console.WriteLine("I am the base class");
            return null;
        }
    }
    class PlatformObject: GameObject, ICloneable
    {
        object ICloneable.Clone()
        {
            Console.WriteLine("I am the derived class");
            return null;
        }
    }
    class XmlContentReaderBase<T> where T : GameObject, new()
    {
        static public object Deserialize()
        {
            T obj = new T();
            ((ICloneable)obj).Clone();
            return obj;
        }
    }
}
输出:

我是派生类