问题标签 [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 投票
8 回答
29360 浏览

c# - 您将如何在 C# 中实现“特征”设计模式?

我知道 C# 中不存在该功能,但 PHP 最近添加了一个名为Traits的功能,起初我认为它有点傻,直到我开始考虑它。

假设我有一个名为Client. Client有一个名为 的属性Name

现在我正在开发一个可供许多不同客户使用的可重复使用的应用程序。所有客户都同意客户应该有一个名字,因此它在基类中。

现在客户 A 过来并说他还需要跟踪客户的体重。客户 B 不需要体重,但他想跟踪身高。客户 C 想要同时跟踪体重和身高。

使用特征,我们可以同时创建重量和高度特征特征:

现在我可以满足所有客户的需求,而无需在课堂上添加任何多余的内容。如果我的客户稍后回来说“哦,我真的很喜欢这个功能,我也可以拥有它吗?”,我只需更新类定义以包含额外的特征。

您将如何在 C# 中完成此任务?

接口在这里不起作用,因为我想要属性和任何关联方法的具体定义,并且我不想为每个版本的类重新实现它们。

(“客户”是指雇佣我作为开发人员的字面意义上的人,而“客户”指的是编程课程;我的每个客户都有他们想要记录信息的客户)

0 投票
5 回答
3672 浏览

java - C# 等效于接口中的 Java 8 默认方法

我听说在 Java 8 中可以灵活地在接口中定义函数。我认为我们可以在所有实现此类接口的类中使用此功能具有一些默认状态。

所以,我的问题是,截至今天,我们在 C# 中是否有任何此类功能?微软在这方面有什么计划吗?

0 投票
2 回答
2102 浏览

c# - 如果在 C# 8.0 中实现了默认接口方法,为什么我还需要抽象类?

我最近遇到了一个正在考虑在下一版 C# 中添加的功能列表。其中之一称为“默认接口方法”:

https://github.com/dotnet/csharplang/blob/master/proposals/default-interface-methods.md

简而言之,它将允许您在接口本身上定义实际的方法实现,这意味着接口现在可以具有实现。既然是这种情况,并且 C# 类可以从多个接口实现/继承,那么我到底为什么要使用抽象类呢?

我唯一想到的是接口不能有构造函数,所以可能需要在抽象类构造函数中运行一些逻辑,这将证明定义抽象类是合理的。

还有其他任何人都可以想到的场景吗?

0 投票
6 回答
2081 浏览

c# - 默认接口方法。现在,抽象类和接口之间有什么深刻而有意义的区别?

我知道抽象类是一种无法实例化的特殊类。抽象类只能被子类化(继承自)。换句话说,它只允许其他类继承它,但不能实例化。优点是它可以为所有子类强制执行某些层次结构。简单来说,它是一种强制所有子类继承相同层次结构或标准的契约。

我也知道接口不是一个类。它是由“接口”一词定义的实体。接口没有实现;它只有签名,或者换句话说,只有没有主体的方法的定义。作为与抽象类的相似之处之一,它是一种契约,用于定义所有子类的层次结构,或者它定义了一组特定的方法及其参数。它们之间的主要区别在于,一个类可以实现多个接口,但只能从一个抽象类继承。由于 C# 不支持多重继承,因此使用接口来实现多重继承。

当我们创建一个接口时,我们基本上是在创建一组没有任何实现的方法,这些实现必须被实现的类覆盖。优点是它为一个类提供了一种成为两个类的一部分的方法:一个来自继承层次结构,一个来自接口。

当我们创建一个抽象类时,我们正在创建一个基类,它可能具有一个或多个已完成的方法,但至少有一个或多个方法未完成并声明为抽象类。如果抽象类的所有方法都未完成,那么它与接口相同。

但是 但是 但是

我注意到我们将在 C# 8.0 中使用默认接口方法

也许我问它是因为我只有 1-2 年的编程经验,但是现在抽象类和接口之间的主要区别是什么?

我知道我们不能在界面中制作状态,它们之间只有一个区别吗?

0 投票
2 回答
1013 浏览

c# - C# 8 中的默认接口方法

考虑以下代码示例:

使用代码:

我的问题出在代码上:

问题是:输出应该是15还是55?!

根据 .NET 团队的说法:

决定:于 2017 年 4 月 11 日做出:运行 I2.M,这是运行时最明确的最具体的覆盖。

我不确定这里是因为重写界面上的关键字“new”吗?正确的行为应该是什么?

如果您需要从源代码编译它,您可以从以下网址下载源代码: https ://github.com/alugili/Default-Interface-Methods-CSharp-8

0 投票
2 回答
3024 浏览

c# - C# 8 默认接口实现是否允许多重继承

根据https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/,C# 8 中的新功能之一是接口的默认实现。这个新特性是否也隐含地允许多重继承?如果没有,如果我尝试以下操作会发生什么:

0 投票
2 回答
3106 浏览

c# - 自动属性的默认接口方法和默认值

鉴于自动属性编译为 get_method、set_method 和私有变量,并且由于 C# 8 引入了默认接口方法

接口中的属性可以有默认实现吗?

特别是只获得财产?

0 投票
1 回答
251 浏览

c# - C# 8 中接口成员的默认实现是否与克服抽象类的多重继承问题有关?

我正在阅读这篇博客.NET Engineering Team他们为. 我对它的动机感到困惑,不是. 除此之外,我无法弄清楚任何其他好处。考虑以下代码:Interfaceabstract class

C# 7(不可能提供方法定义)

C# 8(可以提供方法定义)

C# 8中,两者abstract classinterface都可以完成向其成员提供默认实现的相同工作。我对此有以下疑问:

  • 如果Interface提供了默认实现,也支持多重继承,那么c#8中需要抽象类吗?

  • 在这种情况下会发生什么?

0 投票
1 回答
2116 浏览

c# - C# 8 预览中的抽象接口方法

我尝试:

我得到:

修饰符 'abstract' 在 C# 7.3 中对此项无效。请使用语言版本“预览”或更高版本。

但是我在https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8中找不到任何提及此功能的内容

我在哪里可以找到相关文档?还是这里的信息有误?

0 投票
0 回答
142 浏览

c# - 何时在具有默认实现的接口上使用抽象类?

C# 8 在接口中添加了默认方法实现的选项,这意味着可以在接口中定义方法。

在我不需要默认构造函数,也不需要派生类中的继承字段的情况下,我应该默认为:具有默认实现的接口,还是抽象类的老式方式?

这种情况下是否有样式约定?