Статично для примера, как мне правильно обращаться? - PullRequest
2 голосов
/ 13 марта 2012

У меня есть статический класс. Я устарел и изменяю класс, чтобы заставить клиентов использовать переменную экземпляра.

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

Возможно ли это?

Ответы [ 4 ]

2 голосов
/ 13 марта 2012

Вы можете использовать несколько способов, но ни один из них не делает точно то, что вы хотите:

  1. Удалите модификатор static, сделав его обычным нестатическим классом, и, при желании, сделайте его частичным, реализовав новый связанный с экземпляром код во втором файле. Однако с помощью этого метода вы не сможете устареть весь статический класс, поскольку у вас есть только один класс.
  2. Поместите новый класс в новое пространство имен
  3. Поместите новый класс в новый проект, но в то же пространство имен, что и исходный

Если вы сделаете все старые статические элементы устаревшими, я бы выбрал вариант nbr. 1.

1 голос
/ 13 марта 2012

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

[Obsolete("This class is obsolete; use class B instead")]

Visual Studio намекает пользователю, что он должен использовать новый класс.

0 голосов
/ 13 марта 2012

Одна вещь, которую вы могли бы сделать, это реализовать нестатические версии методов через явно реализованный интерфейс , например:

public interface ITest
{
    string Foo();
}

// your class
public class Test : ITest
{
    //original, static version of Foo
    public static string Foo() 
    {
        return "foo";
    }   

    // Foo reimplemented as a non-static method
    // note that you need to implement ITest explicitly
    // for it to compile
    string ITest.Foo()
    {
        return "foo";
    }   
}

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

ITest t = new Test();   //assigning to a variable of type ITest
Console.WriteLine(t.Foo()); // writes "foo"
Console.WriteLine(Test.Foo()); // and calling the static method still works too
0 голосов
/ 13 марта 2012

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

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

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