到目前为止,我已经了解到抽象类不能被实例化,因为它们仅供其他类继承。但我无法理解我在msdn库中看到的代码:
WebRequest myRequest = WebRequest.Create("http://www.contoso.com");在文档中,它说上面的代码返回一个WebRequest实例。
但是WebRequest类是一个抽象类,当抽象类无法实例化时,上面的代码如何返回抽象类的实例。
请解除我的痛苦。
发布于 2014-10-07 04:56:43
最有可能的是,该示例中的Create方法将返回WebRequest子类的实例。
为了看你到底得到了什么,你可以试试这样的方法:
WebRequest myRequest = WebRequest.Create("http://www.contoso.com");
Type t = myRequest.GetType();
Console.WriteLine(t.Name);发布于 2014-10-07 05:02:03
抽象类不能立即实例化。也就是说,你不能做new SomeAbstractClass()。但是,可以实例化抽象类的子类。因此,抽象类在功能上与接口相似,只是它们可以包含方法定义和成员字段。
因此,抽象类很适合引入抽象级别。WebRequest类在这里是一个很好的例子:它有各种协议的子类,例如HTTP或HTTPS。当您通过WebRequest.Create("https://example.com/")实例化一个请求时,您将得到一个可以处理HTTPS协议的web请求实例,但它也是一个WebRequest实例。静态方法Create(…)是一种工厂方法。
也请参阅文件,为WebRequest.Create(…)
发布于 2014-10-07 16:59:11
WebRequest是一个不能实例化的抽象类。WebRequest.Create是一个静态方法,它返回System.Net.HttpWebRequest的具体类型,该类型是System.Net.WebRequest的派生子类。因为它是派生类型,所以它仍然将自己标识为WebRequest,尽管它的完全限定类型名是System.Net.HttpWebRequest。
这很有用的原因是您不再需要关心实际的实现。您知道WebRequest将拥有您所需的所有功能,所以如果具体类型是System.Net.HttpWebRequest、Steves.Awesome.WebRequest或Georges.NotSoAwesome.WebRequest,那就无关紧要了,因为它们都是从WebRequest继承的。
你的代码行:
WebRequest myRequest = WebRequest.Create("http://www.contoso.com");这并不是说它实际上将创建一个WebRequest,而只创建一个WebRequest。这就是说,所创建的任何内容都将继承WebRequest,并与您从观点出发所需要的任何东西兼容。
https://softwareengineering.stackexchange.com/questions/258269
复制相似问题