c # Как вернуть класс, который указывает универсальный класс в методе фабрики - PullRequest
1 голос
/ 29 сентября 2019

Хотелось бы узнать, можно ли сделать такой метод без этого уродливого приведения к возвращаемому результату?

    public static AbstractFileReader<T> GetReader<T>(string filename, T data)
    {
        if(data is string)
        {
            return GetTextFileReader(filename) as AbstractFileReader<T>;
        }
        else if(data is byte[])
        {
            return GetBytesFileReader(filename) as AbstractFileReader<T>;
        }
        else
        {
            Debug.LogError("There is no reader for that type of data : " + data.GetType().ToString());
            return null;
        }
    }

Чтобы упростить это, это моя архитектура:

> AbstractFileReader<T> => The generic base class
> AbstractTextFileReader : AbstractFileReader<string> => an abstract class
> StandaloneTextFileReader : AbstractTextFileReader => the final implementation

Моей первой мыслью было создать такой метод:

    public static AbstractFileReader<T> GetReader<T>(string filename, T data)
    {
        if(data is string)
        {
            return StandaloneTextFileReader(filename);
        }
        else if(data is byte[])
        {
            return StandaloneBytesFileReader(filename);
        }
        else
        {
            Debug.LogError("There is no reader for that type of data : " + data.GetType().ToString());
            return null;
        }
    }

Но, похоже, мой компилятор не принимает его. Есть ли способ добиться этого? Спасибо

1 Ответ

3 голосов
/ 29 сентября 2019

Дженерики здесь не оказывают вам никакой пользы.

Все, что вы сейчас используете для T, - это укажите тип одного из параметров (который вы даже не используете, кромезапросить его тип). Вы могли бы так же легко написать это как AbstractFileReader GetReader(string filename, Object data).

. Суть обобщения заключается в том, чтобы не заботиться , что такое тип (хотя вы можете наложить на него ограничения) и что все методычто обобщенный класс действует одинаково, независимо от того, что представляет собой тип T (например, List s).

В данном случае это не так.

Таким образом, выздесь вообще не следует использовать Generics. Просто где-нибудь есть методы GetReaderForString и GetReaderForBytes и возвращайте либо StandaloneTextFileReader, либо StandaloneBytesFileReader в зависимости от ситуации (или полностью обходитесь без методов и просто new соответствующий класс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...