Как лучше всего обеспечить соблюдение условий ограничения универсального типа? - PullRequest
2 голосов
/ 22 августа 2011

Я написал очень простой класс, принимающий универсальный параметр, скажем T.Теперь я хочу обеспечить, чтобы T мог быть только одним из моих пользовательских типов ClassA, ClassB и ClassC, чтобы я не мог по ошибке использовать его с бессмысленными типами, такими как int, long или дажедругие классы я написал.Я думал, что способ сделать это - заставить эти три класса реализовать один и тот же пустой интерфейс ISomething и использовать where T : ISomething в определении универсального класса.Тем не менее, я не знаю, имеет ли смысл этот подход (реализация пустого интерфейса).Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Это не сработает.Поскольку T относится к типу ISomething, у вас есть доступ только к членам ISomething внутри вашего универсального класса.* * * * * * * * * * * * * * * * * * * * * * * * * * Если ваши классы имеют общие функциональные возможности, поместите эти общие функциональные возможности в интерфейс, поскольку ISomething - это только маркерный интерфейс без каких-либо членов.Если они этого не делают, им не следует реализовывать один и тот же интерфейс, и вы должны спросить себя, правильный ли у вас дизайн.
Пожалуйста, приведите более конкретный пример, может быть, тогда мы сможем дать более практические советы.

1 голос
/ 22 августа 2011

это зависит от того, какое ограничение вы хотите добавить и какую операцию выполняет ваш класс.

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

вВ приведенном ниже примере универсальный класс использует метод GetString (), который реализован в базовом классе.Вам нужно добавить ограничение на этот тип, чтобы общий класс нашел этот метод

 class A
    {
        public string GetString()
        {
            return "A";
        }
    }

    class B : A
    {
        public string GetAnotherString()
        {
            return "B";
        }
    }

    class GenericClass<T> where T:A
    {
        private T _obj;

        public GenericClass(T obj)
        {
            _obj = obj;
        }

        public string GetString()
        {
            return _obj.GetString();
        }
    }

    public class MyClass
    {
        public static void Main()
        {
            GenericClass<A> genericClass=new GenericClass<A>(new B());
            Console.WriteLine(genericClass.GetString());
            Console.Read();
        }
    }
...