【发布时间】:2017-12-01 21:00:22
【问题描述】:
我知道抽象类是一种不能被实例化的特殊类。抽象类只能被子类化(继承自)。换句话说,它只允许其他类从它继承,但它不能被实例化。优点是它可以为所有子类强制执行某些层次结构。简单来说,它是一种强制所有子类继承相同层次结构或标准的契约。
我也知道接口不是类。它是由“接口”一词定义的实体。接口没有实现;它只有签名,或者换句话说,只有没有主体的方法的定义。作为与抽象类的相似之处之一,它是一种契约,用于定义所有子类的层次结构,或者它定义了一组特定的方法及其参数。它们之间的主要区别在于,一个类可以实现多个接口,但只能从一个抽象类继承。由于 C# 不支持多重继承,因此使用接口来实现多重继承。
当我们创建一个接口时,我们基本上是在创建一组没有任何实现的方法,这些实现必须被实现的类覆盖。优点是它提供了一种方法让一个类成为两个类的一部分:一个来自继承层次结构,一个来自接口。
当我们创建一个抽象类时,我们正在创建一个基类,它可能具有一个或多个已完成的方法,但至少有一个或多个方法未完成并声明为抽象类。如果一个抽象类的所有方法都不完整,那么它就是一个接口。
但是 但是 但是
我注意到我们将在 C# 8.0 中使用默认接口方法
也许我问它是因为我只有 1-2 年的编程经验,但是 现在抽象类和接口之间的主要区别是什么?
我知道我们不能在界面中做状态,它们之间会不会只有一个区别?
【问题讨论】:
-
诚实吗?它们将变得几乎相同,同时将模拟多重继承引入 C#。这是许多 C# 开发人员(包括我自己)完全反对该功能的主要原因之一。
-
我最近评论说,C#6 旨在展示编程语言设计中的收益递减,而 C#7 旨在展示收益递减的收益递减。您可以看到 C#8 的发展方向。它正在形成一种四维雪球。微软需要为这些人找到一种新的工作语言。这个完成了。它具有所有功能。
-
其实我真的很喜欢不可为空引用类型的想法。
-
@EdPlunkett 哈!在完成您之前的评论时,我在想正是。可能是因为我今天早上刚读到一篇关于他们的文章。
-
我同意默认接口方法会增加混乱,除非因此用作我们应该为其引入命名约定的特征(例如
IFooTrait或只是FooTrait)。
标签: c# interface abstract-class c#-8.0 default-interface-member