Вызов метода переопределения производного класса из родовой ссылки в C # - PullRequest
1 голос
/ 15 ноября 2011

Я строю игру, и есть базовое наследование:

GameObject является базовым классом, имеет виртуальный метод с именем Clone

PlatformObject является производным от GameObject, переопределяя метод Clone

У меня есть универсальный класс сериализатора / десериализатора для любого GameObject или производных, определенных следующим образом:

public class XmlContentReaderBase<T> where T : GameObject

Мой класс XML Reader не знает о моем производном типе. У меня проблема с этой строкой:

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

Первая строка работает нормально и возвращает PlatformObject, что правильно. Но вторая строка вызывает метод Clone базового класса, GameObject, что не то, что я хочу. Мне нужно вызвать PlatformObject.Clone метод, как я могу это сделать?

Спасибо, Может.

1 Ответ

1 голос
/ 15 ноября 2011

Я написал реализацию, очень близкую к этому, и вижу, что 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;
        }
    }

}

Вывод:

Я производный класс

...