扩展方法和方法覆盖

时间:2016-07-14 17:42:19

标签: c#

前几天,我在与扩展方法相关的stackoverflow帖子中发现了这个语句:

  

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

Java equivalent to C# extension methods

这是什么意思?任何人都可以提供一个明确的例子来阐明这一陈述吗?

1 个答案:

答案 0 :(得分:1)

我认为他们指的是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#有关,因为它实际上为每个Generic类型生成一个新类。使用类似Java的语言,它使用“Type Erasure Generics”,你不能“重载”泛型方法,因为一切都是真正的类型对象。