例如,静态,我如何正确处理
本文关键字:正确处理 静态 例如 | 更新日期: 2023-09-27 18:27:34
我有一个静态类,我正在弃用并修改该类以强制客户端使用实例变量。
问题是,我如何处理允许保留和使用以前的静态类(具有过时的属性)以及允许使用新的非静态类(相同的名称,相同的方法名称)?
这可能吗?
有几种方法可以使用,但没有一种能完全满足的要求:
- 删除
static
修饰符,使其成为一个普通的非静态类,并可选地使其成为分部类,在第二个文件中实现与实例相关的新代码。然而,使用此方法,您将无法废弃整个静态类,因为您只有一个类 - 将新类放在新的命名空间中
- 将新类放置在新项目中,但与原始类位于相同的命名空间中
如果你让所有旧的静态成员都过时了,我会选择nbr选项。1.
我认为不可能保持相同的名称和参数,但你可以这样做
[Obsolete("This class is obsolete; use class B instead")]
Visual Studio将提示用户,他们应该使用新类。
如果类名和成员相同,则类型不明确。这通常是使用过时属性的消息字段来告诉调用者要使用什么类,而在本例中,使用新的实例类。
也许你可以想出一些复杂的版本接口,但即使在最好的情况下,调用者也不清楚,他们必须知道自己在处理哪个版本。调用方需要以不同的方式处理instance和静态类,因此隐藏他们正在使用的类只会导致问题(如果可能的话)。
您可以做的一件事是通过显式实现的接口来实现方法的非静态版本,如下所示:
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