扩展方法和方法重写

本文关键字:方法 重写 扩展 | 更新日期: 2023-09-27 17:57:03

前几天,我在一篇与扩展方法相关的堆栈溢出帖子中发现了这条语句:

最主要的是能够根据不同泛型的参数实例化覆盖不同的方法。这类似于 Haskell 的类型类

Java 等效于 C# 扩展方法

这应该意味着什么?谁能举一个重要的例子来澄清这一说法?

扩展方法和方法重写

我假设他们指的是这样一个事实,即 C# 的编译器将选择最狭义地定义类型的方法。因此,例如,如果您有一个抽象类 (ABS) 和一个继承类 (CLS2) 以及 2 个扩展方法

public static object GetStuff(this ABS obj){
    blah blah blah
} 
  public static object GetStuff(this CLS obj){
    blah blah blah
} 

如果您调用 CLS2。GetStuff() 编译器将选择第二种方法。一旦你知道你可以通过使其更具体来"覆盖"扩展方法。所以如果你有一个泛型类

public class Foo<T>{}

你可以创建 2 个扩展方法(使用上面的类作为类型)

public static void DoSomething(this Foo<Abs> abs){}

public static void DoSomething(this Foo<CLS2> abs){}

这里的第二种方法是"覆盖"更"通用"的抽象类型。

这在 C# 中是可能的,因为它实际上为每个泛型类型生成一个新类。对于像Java这样的语言,它使用"类型擦除泛型",你不能"重载"泛型方法,因为所有东西都是底层的对象类型。