Статические методы на общих классах? - PullRequest
6 голосов
/ 01 апреля 2009

Хорошо, это тот случай:

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

Я хочу иметь возможность сделать что-то вроде этого:

GenericBaseclass.Initialize(AssociatedObject);

в то же время имея класс, который делает так:

public class DerivedClass : GenericBaseclass<int>
{
   ...
}

Есть ли способ сделать это? Я мог бы создать неуниверсальный базовый класс и поместить туда статический метод, но мне не нравится этот хак

Ответы [ 2 ]

15 голосов
/ 01 апреля 2009

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

Имейте в виду, что для статических переменных вы получаете разные статические переменные для каждого типа аргумента:

using System;

public class GenericType<TFirst, TSecond>
{
    // Never use a public mutable field normally, of course.
    public static string Foo;
}

public class Test
{    
    static void Main()
    {
        // Assign to different combination
        GenericType<string,int>.Foo = "string,int";
        GenericType<int,Guid>.Foo = "int,Guid";
        GenericType<int,int>.Foo = "int,int";
        GenericType<string,string>.Foo = "string,string";


        // Verify that they really are different variables
        Console.WriteLine(GenericType<string,int>.Foo);
        Console.WriteLine(GenericType<int,Guid>.Foo);
        Console.WriteLine(GenericType<int,int>.Foo);
        Console.WriteLine(GenericType<string,string>.Foo);

    }
}

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

7 голосов
/ 01 апреля 2009

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

Единственный обходной путь - иметь базовый класс, из которого происходит универсальный класс.

...