c# - 在 C# 8.0 中有没有办法在类上公开默认成员实现?
问题描述
在 C# 8.0 中,接口可以具有某些成员的默认实现。这些实现是明确的,意味着它们不能通过类实例访问,我们必须转换为接口类型才能调用它们。有没有办法在同名的类实例上公开这个实现?可以通过将 this 指针转换为接口类型并调用如下方法来以另一个名称公开它:
void A()
{
((ISomething)this).B();
}
但是,我似乎无法找到一种方法来使用 B 的原始名称公开实现,因为如果我声明一个方法 B,它会被视为实现导致无限递归的接口的方法。有什么方法可以在不复制的情况下公开实现,或者我缺少什么?
澄清一下,我正在寻找一种实现类似特征的功能的方法,即能够将实现从接口直接导入类的公共 API 而无需更改方法名称(大概接口中的名称是最好的)。问题不在于如何以类的用户身份调用该方法,而是如何使其成为该类的公共 API 的一部分。
扩展方法是一种解决方案,但默认接口实现可以访问受保护的成员并且可以重载。
解决方案
一种可能性是为它们提供属性。当我需要从类中引用显式实现时,我会这样做。
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
}
}
推荐阅读
- istio - 如何在 Istio 中压缩统计端点?
- typescript - 基于泛型类型的可选属性
- python - keras 张量板回调,没有属性“_should_trace”
- c++ - printf() 和 cin 交互
- excel - VBA - 运行一个适应不总是相同范围的公式
- swift - 单击第一个按钮时在 2 个按钮之间显示 uiview
- rspec - DRY 测试的操作是否可行?
- angular - 有人能告诉我我的 RXJS 代码是如何工作的吗?
- html - 渲染表格和模型
- google-apps-script - 是否有查询参数可以使用 GAS 将 Google Sheet 导出到 pdf 的边距设置