如何将Generic类型作为强类型返回

时间:2012-01-21 14:09:16

标签: c# generics c#-4.0 polymorphism

我正在将一些Delphi代码移植到C#系统中,我可以从同一来源读取不同类型的字段。我想使用父类并在子类中封装do的所有内部方式来隐藏每个字段类型的内部和具体机制。

我做了一个简单的例子来说明“我的问题”在哪里:

using System;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            ParentField<int> fieldInteger = new MyIntField<int>();
            fieldInteger.Value = 12;

            ParentField<string> fieldString = new MyStringField<string>();
            fieldString.Value = "This is a String";

            Console.WriteLine("1. The Integer Value: " + fieldInteger.Value);
            Console.WriteLine("1. The String Value: " + fieldString.Value);

            int localInteger = fieldInteger.GetRealStrongTypedValue;
            string localString = fieldString.GetRealStrongTypedValue;

            Console.WriteLine("2. The Integer Value: " + localInteger);
            Console.WriteLine("2. The String Value: " + localString);
        }
    }







    public abstract class ParentField<T>
    {
        public abstract Object Value { get; set; }
        public abstract T GetRealStrongTypedValue { get; }
    }

    public sealed class MyIntField<T> : ParentField<T>
    {
        public override Object Value
        {
            get { return valor; }
            set { valor =  (int)value; }
        }
        public override T GetRealStrongTypedValue
        {
            get { return valor; }  // ERROR...
        }

        private int valor;
    }

    public sealed class MyStringField<T> : ParentField<T>
    {
        public override Object Value
        {
            get { return valor; }
            set { valor = (string)value; }
        }
        public override T GetRealStrongTypedValue
        {
            get { return valor; } // ERROR...

        }

        private string valor;
    }
}

此外,我尝试以这种方式从子GetRealStrongTypedValue实例方法中删除Generic:

public sealed class MyStringField<T> : ParentField<T>
{
    public override Object Value
    {
        get { return valor; }
        set { valor = (string)value; }
    }
    public new string GetRealStrongTypedValue
    {
        get { return valor; }
    }

    private string valor;
}

但是错误是我没有从ParentField Class实现抽象方法。

我曾尝试将ParentField.GetRealStrongTypedValue更改为虚拟,实现虚假内容,但多态性根本不会运行,并始终使用精确的ParentField.GetRealStrongTypedValue,因此它会返回虚假内容。

任何简单明智的想法? : - )

...谢谢

1 个答案:

答案 0 :(得分:2)

我认为您要做的不是使MyStringField通用,而是将其作为ParentField<T>的类型特定实现。

public sealed class MyStringField : ParentField<string>
{
    public override Object Value
    {
        get { return valor; }
        set { valor = (string)value; }
    }
    public override string GetRealStrongTypedValue
    {
        get { return valor; } // ERROR...

    }

    private string valor;
}