首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象类混淆

抽象类混淆
EN

Software Engineering用户
提问于 2014-10-07 04:08:23
回答 3查看 530关注 0票数 4

到目前为止,我已经了解到抽象类不能被实例化,因为它们仅供其他类继承。但我无法理解我在msdn库中看到的代码:

代码语言:javascript
复制
WebRequest myRequest = WebRequest.Create("http://www.contoso.com");

在文档中,它说上面的代码返回一个WebRequest实例。

但是WebRequest类是一个抽象类,当抽象类无法实例化时,上面的代码如何返回抽象类的实例。

请解除我的痛苦。

EN

回答 3

Software Engineering用户

发布于 2014-10-07 04:56:43

最有可能的是,该示例中的Create方法将返回WebRequest子类的实例。

为了看你到底得到了什么,你可以试试这样的方法:

代码语言:javascript
复制
WebRequest myRequest = WebRequest.Create("http://www.contoso.com");
Type t = myRequest.GetType();
Console.WriteLine(t.Name);
票数 9
EN

Software Engineering用户

发布于 2014-10-07 05:02:03

抽象类不能立即实例化。也就是说,你不能做new SomeAbstractClass()。但是,可以实例化抽象类的子类。因此,抽象类在功能上与接口相似,只是它们可以包含方法定义和成员字段。

因此,抽象类很适合引入抽象级别。WebRequest类在这里是一个很好的例子:它有各种协议的子类,例如HTTP或HTTPS。当您通过WebRequest.Create("https://example.com/")实例化一个请求时,您将得到一个可以处理HTTPS协议的web请求实例,但它也是一个WebRequest实例。静态方法Create(…)是一种工厂方法。

也请参阅文件,为WebRequest.Create(…)

票数 5
EN

Software Engineering用户

发布于 2014-10-07 16:59:11

WebRequest是一个不能实例化的抽象类。WebRequest.Create是一个静态方法,它返回System.Net.HttpWebRequest的具体类型,该类型是System.Net.WebRequest的派生子类。因为它是派生类型,所以它仍然将自己标识为WebRequest,尽管它的完全限定类型名是System.Net.HttpWebRequest

这很有用的原因是您不再需要关心实际的实现。您知道WebRequest将拥有您所需的所有功能,所以如果具体类型是System.Net.HttpWebRequestSteves.Awesome.WebRequestGeorges.NotSoAwesome.WebRequest,那就无关紧要了,因为它们都是从WebRequest继承的。

你的代码行:

代码语言:javascript
复制
WebRequest myRequest = WebRequest.Create("http://www.contoso.com");

这并不是说它实际上将创建一个WebRequest,而只创建一个WebRequest。这就是说,所创建的任何内容都将继承WebRequest,并与您从观点出发所需要的任何东西兼容。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/258269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档