Как вернуть универсальный тип как строго типизированный тип - PullRequest
1 голос
/ 21 января 2012

Я портирую некоторый код Delphi на C # в системе, где я могу читать различные типы полей из одного и того же источника.Я хотел бы использовать родительский класс и инкапсулировать все внутренние методы в дочерних классах, чтобы скрыть внутренний и конкретный механизм каждого типа поля.

Я сделал простой пример, чтобы показать, где находится «моя проблема»:

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 метода экземпляра следующим образом:

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 Ответ

2 голосов
/ 21 января 2012

Я думаю, что вы хотите сделать не общий 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...