Ограничение T для строкового представления и интервал?

17
задан Daniel Fischer 3 August 2012 в 21:16
поделиться

6 ответов

Ограничение типа предназначено, чтобы использоваться с Интерфейсами. Ваш образец предлагает, чтобы Вы хотели позволить классы, которые наследовались интервалу и представляют в виде строки , который является видом ерунды. Я предлагаю, чтобы Вы разработали интерфейс, который содержит методы, Вы будете использовать в своем универсальном классе StatisticItemHits и использование, которые взаимодействуют через интерфейс как ограничение. Однако я действительно не вижу Ваших требований здесь, возможно, Вы могли отправить еще некоторые детали о своем сценарии?

15
ответ дан 30 November 2019 в 12:58
поделиться

Вы могли сделать StatisticItemHits<T> абстрактный класс и создать два подкласса:

StatisticItemHitsInt : StatisticItemHits<int>{}

StatisticItemHitsString : StatisticItemHits<string>{}

Тем путем там может только быть международное и строковое представление StatisticItemHits

6
ответ дан 30 November 2019 в 12:58
поделиться

Как другие сказали, Вы не можете использовать ограничения типа таким образом. То, что можно сделать, должно специализироваться от базового типа следующим образом:

public class StatisticItemHits <T> { }

public class StringStatisticItemHits : StatisticItemHits<string> { }

public class IntegerStatisticItemHits : StatisticItemHits<int> { }

кроме того, поскольку Ваш базовый класс универсален, Вы не будете в состоянии использовать это для полиморфно. Если необходимо сделать, это заставляет StatisticItemHits реализовать интерфейс и использовать это для ссылочных экземпляров. Что-то как:

public class StatisticItemHits <T> : IStaticticItemHits { }

public interface IStatisticItemHits { }
5
ответ дан 30 November 2019 в 12:58
поделиться

Учитывая, что у Вас только есть два типа здесь, я спустился бы по маршруту OO здесь вместо этого и просто имел бы два класса для двух типов.

Дженерики лучше всего используются, где обстоятельства, при которых они могут быть применены, Вы знаете, универсальный . Они - намного меньше использования при обстоятельствах как это.

можно ограничить структурой или типами классов только, и я действительно думаю, что должны быть числовые или основанные на операторе ограничения (например, должен поддерживать + =)

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

2
ответ дан 30 November 2019 в 12:58
поделиться

Не возможный сделать это, с 'где'. Вы не можете сделать 'или'.

1
ответ дан 30 November 2019 в 12:58
поделиться

Вы не можете ограничить его для строкового представления и интервал от где пункт. Можно проверить его в конструктора, но это - вероятно, не хорошее место для проверки. Мой подход должен был бы специализировать класс и абстрагировать создание класса в (полу-) шаблон "фабрика":

class MyRestrictedGeneric<T>
{
    protected MyRestrictedGeneric() { }


    // Create the right class depending on type T
    public static MyRestrictedGeneric<T> Create<T>()
    {
        if (typeof(T) == typeof(string))
            return new StringImpl() as MyRestrictedGeneric<T>;

        if (typeof(T) == typeof(int))
            return new IntImpl() as MyRestrictedGeneric<T>;

        throw new InvalidOperationException("Type not supported");
    }


    // The specialized implementation are protected away
    protected class StringImpl : MyRestrictedGeneric<string> { }
    protected class IntImpl : MyRestrictedGeneric<int> { }
}

Этот путь можно ограничить использование класса, чтобы просто представить в виде строки и интервал внутренне внутренняя часть класс.

1
ответ дан 30 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: