gpt4 book ai didi

c# - 可以在 C# 中重写静态方法吗?

转载 作者:IT王子 更新时间:2023-10-29 04:05:04 26 4
gpt4 key购买 nike

有人告诉我,static 方法是隐式的 final,因此不能被覆盖。真的吗?

  1. 有人可以提供一个更好的覆盖静态方法的例子吗?

  2. 如果静态方法只是类方法,那么拥有它们的真正用途是什么?

最佳答案

(1) 静态方法不能被覆盖,但是可以使用“new”关键字隐藏它们。大多数情况下,覆盖方法意味着您引用基类型并希望调用派生方法。由于静态是类型的一部分并且不受没有意义的 vtable 查找的影响。

例如静力学做不到:

public class Foo { 
public virtual void Bar() { ... }
}
public class Bar : Foo {
public override void Bar() { ... }
}

// use:
Foo foo = new Bar(); // make an instance
foo.Bar(); // calls Bar::Bar

因为静态不适用于实例,所以您总是明确指定 Foo.Bar 或 Bar.Bar。所以覆盖在这里没有意义(尝试用代码表达它......)。

(2)静态方法有不同的用法。例如,它在单例模式中用于获取类型的单个实例。另一个例子是“static void Main”,它是程序中的主要访问点。

基本上,只要您不想或不能在使用前创建对象实例,就可以使用它们。例如,当静态方法创建对象时。

[更新]

一个简单的隐藏示例:

public class StaticTest
{
public static void Foo() { Console.WriteLine("Foo 1"); }
public static void Bar() { Console.WriteLine("Bar 1"); }
}

public class StaticTest2 : StaticTest
{
public new static void Foo() { Console.WriteLine("Foo 2"); }
public static void Some() { Foo(); Bar(); } // Will print Foo 2, Bar 1
}

public class TestStatic
{
static void Main(string[] args)
{
StaticTest2.Foo();
StaticTest2.Some();
StaticTest.Foo();
Console.ReadLine();
}
}

请注意,如果您将类设置为static,则无法执行此操作。静态类必须派生自 object

这与继承的主要区别在于编译器可以在编译时确定在使用静态时调用哪个方法。如果您有对象实例,则需要在运行时执行此操作(称为 vtable 查找)。

关于c# - 可以在 C# 中重写静态方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14828271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com