问题标签 [default-interface-member]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
552 浏览

c# - 具有 C#8 默认接口实现/特征的事件继承

目前几乎没有关于新 C#8 默认接口实现(特征)的事件限制的文档。我对规范提案特别困惑。该示例不仅给出了无效的 C#(“覆盖”事件缺少标识符),而且在 C#8(VS2019,.NET Core 3.0)中实现任何这些都会返回大量编译器异常。此外,C#8 的发行说明没有提及接口特征的事件。当我继续尝试寻找答案时,我也无法从未解决的问题列表中收集任何有用的信息。

所以问题是:这个功能是否实现和可用?如果是这样,正确的语法是什么?

0 投票
2 回答
2425 浏览

c# - 编译器看不到接口中的默认实现?

这是我在 ac# 项目中的代码,它针对 Visual Studio 2019 (16.3.9) 的 .NET Core 3.0(所以我应该使用 C# 8.0)

编译错误是:

CS1061“SumRequest”不包含“ToJson”的定义,并且找不到接受“SumRequest”类型的第一个参数的可访问扩展方法“ToJson”(您是否缺少 using 指令或程序集引用?)

有人可以阐明这种行为吗?

0 投票
1 回答
576 浏览

c# - C# 8 默认实现和依赖倒置

在 C#8 中,微软为接口方法引入了默认实现。这仍然是一个相当新的功能,似乎有很多相关的博主都在写这个。

我想知道的是,默认实现是否有可能成为依赖倒置和 DI 的有用工具,或者它是否会促进不良的编程风格?它是否违反了任何众所周知的原则,例如 SOLID?

0 投票
2 回答
197 浏览

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

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

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

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

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

0 投票
2 回答
773 浏览

oop - 我们可以用 C# 中的默认方法用接口替换抽象类吗

在 C# 8.0 中,我们有一个新功能,我们可以在接口中提供默认方法实现,也可以被其实现类覆盖。

我们曾经使用带有实例方法的抽象类来为其所有实现类提供通用功能。

现在我可以将那些具有实例方法的抽象类替换为具有 C# 8.0 以后的默认方法实现的接口吗?

0 投票
3 回答
256 浏览

c# - 使成员虚拟化可防止调用默认接口实现并导致 C# 8 中的 StackOverflowException

考虑代码:

问题是,如果我们标记DoWork()BaseClass以便virtual它可以被子类覆盖,它会阻止它调用IChildInterface的默认实现DoWork(),从而导致StackOverflowException.

如果我们从中删除virtual修饰符,一切正常,并调用的默认实现。DoWork()BaseClassIChildInterfaceDoWork()

这种行为是错误还是设计使然?

有没有办法让一些子类提供他们自己的实现DoWork()(从而覆盖BaseClass的实现)但仍然能够使用 IChildInterface的默认实现DoWork()

0 投票
1 回答
270 浏览

c# - C# 8 接口默认实现

亲爱的编辑,您为什么将此问题标记为基于意见的问题?我没有意见,我只是问了一个基本问题。

我对 C# 8 接口实现概念有一个基本的混淆,如您所知,接口不仅仅是一个合同,为什么我们需要默认实现?它在概念上是否正确?为什么合同必须有实施?

0 投票
1 回答
1010 浏览

c# - 如何调用默认方法而不是具体实现

为什么在 C# 8 中更改了默认接口方法的行为?过去如下代码(默认接口方法demo时未发布):

具有以下输出:

控制台输出:

我是界面中的默认方法!
我是一个被覆盖的默认方法!

但是对于 C# 8 最新版本,上面的代码会产生以下输出:

控制台输出:

我是一个被覆盖的默认方法!
我是一个被覆盖的默认方法!

任何人都可以向我解释为什么这种行为会改变?

笔记:

0 投票
0 回答
43 浏览

.net-core-3.0 - 在 C# 8、.Net Core 3 中覆盖默认接口实现的能力发生了什么?

默认接口方法的 C# 8 提案显示了以下示例...

...但它不能在最新版本的 Visual Studio 2019 (v16.4.5) 中编译。

这个功能怎么了?它只是尚未实施,还是决定放弃它?

0 投票
0 回答
81 浏览

c# - 如何正确调用默认接口实现?

AcceptChanges 的默认接口 impl 的“覆盖”在将其转换为包含默认接口实现的接口类型后不会调用默认接口 impl。为什么?