繁体   English   中英

有什么办法可以重载C#中的扩展方法吗?

[英]Is there any way to overload extension methods in C#?

我有以下模型模式:

public abstract class PARENTCLASS {...}
public class CHILD_A_CLASS : PARENTCLASS{...}
public static class EXTENSION{
  public static METHOD(this PARENTCLASS parent){...}
  public static METHOD(this CHILD_A_CLASS child) {...}
}

像上面这样,当然会有更多的子类(和孙子类),但我只是其中之一。 问题是,当我像以下那样调用扩展方法时:

PARENTCLASS cc = new CHILD_A_CLASS();
cc.METHOD();

它将执行PARENT扩展方法,而不是我期望的CHILD扩展方法。 有人对如何实现这一想法有想法吗? (我不考虑将METHOD本身放入类中并让它进行继承,因为我想保持模型类的整洁并远离其他逻辑)。

当然可以重载扩展方法。 您的代码就是如何执行此操作的示例。

但是,您似乎想要的是以这样一种方式覆盖扩展方法的能力,即对象的运行时类型将确定扩展方法的调用。 就像在类上定义虚拟方法一样。 此功能没有特定的语言语法支持。

如果这对您确实很重要,则可以手动实现该功能。 它需要一些蛮力,但可以完成工作。 例如 ...

public static class Extension {
  public static void Method(this ParentClass p) { 
    var c = p as ChildAClass;
    if ( c != null ) {
      Method(c);
    } else {
      // Do parentclass action
    }
  }
  public static void Method(this ChildAClass c) {
    ...
  }
}

不幸的是,我认为您无法在这里得到想要的东西。 扩展方法是静态的,静态方法不能是虚拟的。

您可以使用JaredPar的解决方案来解决此问题。

如果您的目标是将模型与某些实现分开,建议您研究一下桥接模式 (GOF)。 “从实现中分离抽象”这可能有助于分离您的关注点并保持模型类更整洁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM