繁体   English   中英

在 C# 8.0 中,有没有办法在类上公开默认成员实现?

[英]In C# 8.0 is there a way to expose default member implementation on the class?

在 C# 8.0 中,接口可以为某些成员提供默认实现。 这些实现是明确的,意味着它们不能通过类实例访问,我们必须转换为接口类型才能调用它们。 有没有办法在同名的类实例上公开这个实现? 可以通过将 this 指针转换为接口类型并调用如下方法来以另一个名称公开它:

void A()
{
   ((ISomething)this).B();
}

但是,我似乎无法找到一种方法来使用 B 的原始名称公开实现,因为如果我声明了一个方法 B,它将被视为实现导致无限递归的接口的方法。 有什么方法可以在不复制的情况下公开实现,或者我遗漏了什么?

澄清一下,我正在寻找一种方法来实现类似特性的功能,即能够将实现从接口直接导入到类的公共 API 中,而无需更改方法名称(大概接口中的名称是最好的)。 问题不在于如何以类的用户身份调用该方法,而在于如何使其成为类的公共 API 的一部分。

扩展方法是一种解决方案,但默认接口实现可以访问受保护的成员并且可以重载。

没有简单的方法可以做到; 各种丑陋的解决方法都可能归结为委托给其他方法(静态方法或依赖本身不实现该方法的帮助类)来访问它,即使这样,您也需要以某种方式传递状态。 有一个base(T)语法的提议这里的草案规范,它应该允许base(ISomething).B()引用实现而不会导致循环引用。 这最初计划成为 C# 8 的一部分,但事实证明这太雄心勃勃并且被删减了。 在撰写本文时,它是 包含在 C# 9 中候选者

一种可能性是为它们提供属性。 当我需要从类中引用显式实现时,这就是我所做的。

class Something : IInterfaceA, IInterfaceB {
   public IInterfaceA A => this;
   public IInterfaceB B => this;
}

...

something.A.AMethod();
something.B.BMethod();

您还可以考虑使用扩展方法而不是默认实现。 无论如何,它们都有些相似。

interface IInterface {
}

static class IInterfaceExtensions {
   public static void DoSomething(
      this IInterface me
   ) {
      // do something
   }
}

暂无
暂无

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

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