2016-10-10 93 views
1

为什么HttpContext是抽象类而不是接口?为什么HttpContext是一个抽象类而不是接口?

该类是公共抽象的,所有的方法都是公共抽象的。我不明白为什么这个班是抽象班。

是什么原因导致它是抽象类而不是接口?

+2

这些类型的设计问题如果没有规范的来源很难回答,所以这主要是一种意见,除非来自ASP.NET团队的人能够进入并回答。也就是说,我怀疑这是因为你不能在不破坏开发人员的接口协议的情况下向接口添加成员(向接口添加一个新成员,并且一切都停止编译)。通过抽象类,可以添加可以选择实现的“虚拟”成员。 ASP.NET团队在几个地方采用了这种模式。 – vcsjones

+1

通常抽象基类包含一些默认(即实用程序)或部分实现,子类实现可以利用,而使用接口,没有地方“挂”的东西。这样,“旋转”一个定制的实现就更容易了。即使所有方法都是虚拟的,门仍然是开放的,因此它可以为子类建立部分/辅助实现的“层”。 –

+0

@ escape-llc确实。但在这种情况下,情况并非如此。这是什么让我想知道... – Fred

回答

1

这是我从丹尼尔·罗斯在微软与ASP.NET Core合作的答复。

我相信在这种情况下,使用抽象类可以在将来的版本中添加成员,这是您无法使用接口完成的。

0

关于此主题有很多意见(例如herehere)。而且即使在ASP.NET团队通常使用的接口,我能想到的,为什么他们在这种情况下选择了一个抽象类,有几个原因:

版本控制
我不指望HttpContext类改变很多,但抽象类的版本比接口更容易(它们实际上根本没有版本),因为它们可以使用关键字virtual部分实现。

封装
抽象类封装一组官能团,其中接口提供更高的合同的一个特定功能的。类只能实现一个抽象类,这对于HttpContext实现有意义,例如DefaultHttpContext

向后兼容性
虽然ASP.NET核心是ASP.NET的完全重写,开发者习惯于对HttpContext类节目多年。这两个班都有很多特点。


请记住,我只是猜测在这里,也许一些ASP.NET团队的人可以启发我们。

相关问题