Confusione di classe astratta

4

Ho imparato finora che le classi astratte non possono essere istanziate perché sono lì solo per le altre classi da cui ereditare. Ma non riesco a capire il codice che ho trovato nella libreria msdn:

WebRequest myRequest = WebRequest.Create("http://www.contoso.com");

nella documentazione dice che il codice sopra riportato restituisce un'istanza WebRequest.

ma la classe WebRequest è una classe astratta e in che modo il codice precedente restituisce un'istanza di una classe astratta quando non è possibile creare un'istanza delle classi astratte.

per favore liberami dalla mia agonia.

    
posta David 07.10.2014 - 06:08
fonte

3 risposte

9

Molto probabilmente, il metodo Create in quell'esempio restituirà un'istanza di una sottoclasse di WebRequest .

Per vedere esattamente cosa stai ricevendo, puoi provare qualcosa di simile:

WebRequest myRequest = WebRequest.Create("http://www.contoso.com");
Type t = myRequest.GetType();
Console.WriteLine(t.Name);
    
risposta data 07.10.2014 - 06:56
fonte
5

Le classi astratte non possono essere istanziate immediatamente. Cioè, non puoi fare new SomeAbstractClass() . Tuttavia, puoi creare istanze di sottoclassi di una classe astratta. Quindi le classi astratte sono simili in funzione delle interfacce, tranne che possono contenere definizioni di metodi e campi dei membri.

Pertanto, le classi astratte sono ottime per introdurre un livello di astrazione. La classe WebRequest è un buon esempio qui: ha sottoclassi per vari protocolli come HTTP o HTTPS. Quando instanzia una richiesta tramite WebRequest.Create("https://example.com/") , ottieni un'istanza di richiesta web in grado di gestire il protocollo HTTPS, ma è anche un'istanza WebRequest . Il metodo statico Create(…) è un metodo di fabbrica .

Vedi anche la documentazione per WebRequest.Create(…)

    
risposta data 07.10.2014 - 07:02
fonte
3

WebRequest è una classe astratta che non può essere istanziata. WebRequest.Create è un metodo statico che restituisce un tipo concreto di System.Net.HttpWebRequest che è una sottoclasse derivata di System.Net.WebRequest . Poiché si tratta di un tipo derivato, si identifica ancora come WebRequest anche se il nome del tipo completo è System.Net.HttpWebRequest .

Il motivo per cui è utile è che non è più necessario preoccuparsi dell'attuazione effettiva. Sai che un WebRequest avrà tutte le funzionalità di cui hai bisogno quindi se il tipo concreto è un System.Net.HttpWebRequest o un Steves.Awesome.WebRequest o un Georges.NotSoAwesome.WebRequest non importa perché sono tutti ereditati da WebRequest .

La tua linea di codice:

WebRequest myRequest = WebRequest.Create("http://www.contoso.com");

Questo non significa che in realtà creerà un WebRequest e solo un WebRequest . Sta dicendo che tutto ciò che viene creato erediterà da WebRequest ed è compatibile con qualsiasi cosa tu abbia bisogno di andare avanti dal punto di vista.

    
risposta data 07.10.2014 - 18:59
fonte

Leggi altre domande sui tag