2012-10-01 7 views
21

Sto lavorando attraverso un tutorial 'professionale ASP.NET MVC 3' da J Galloway. In questo tutorial, Jon ci mostra come costruire il negozio di musica MVC.C# - quando usare public int virtuale, e quando utilizzare solo public int

Sono al punto in cui stiamo creando classi CS per modellare i dati utilizzando il codice EF prima.

I tutti gli gli esempi nel libro, public virtual int property {get; set; } vengono utilizzati senza spiegazione. Il termine virtuale è farcito OVUNQUE.

Altrove sul web, non ho visto il termine virtuale utilizzata con qualsiasi tipo di concistency di sorta.

Qualcuno potrebbe spiegare a me:

  1. Lo scopo del termine 'virtuale' in questo particolare contesto
  2. sta usando 'virtuale' necessario?
  3. Perché alcune persone usano "virtuale" e altre no?
  4. Perché alcune persone usano "virtuale" solo quando definiscono chiavi esterne?
  5. Qual è l'uso pratico migliore del termine "virtuale"?

Molte grazie in anticipo

+0

possibile duplicato del [funzioni virtuali] (http://stackoverflow.com/questions/6520394/virtual-functions) e http://stackoverflow.com/questions/1062102/practical-usage-of-virtual -functions-in-c-sharp – dash

+0

Non sapevo che le funzioni virtuali e le proprietà virtuali erano la stessa cosa ??? – Gravy

+1

È la parola chiave 'virtuale' che è importante :-) Indipendentemente dal fatto che si tratti di una funzione o di una proprietà, se non è contrassegnata come virtuale, a meno che un discendente non usi la parola chiave' new', devono prendere l'implementazione come definito nella classe base. Immagina di avere una classe chiamata persona, con una proprietà chiamata "Nome". Se non lo hai contrassegnato come proprietà virtuale, tutti i discendenti di Person, come impostazione predefinita, otterrebbero tale proprietà come nome. Se lo rendi virtuale (o usi la nuova parola chiave) puoi sovrascrivere (o, nel caso di una nuova, sostituire) quell'implementazione con una più specifica. – dash

risposta

10

Per capire veramente la parola chiave virtual si sta andando a voler leggere su Polymorphism in general:

polimorfismo è spesso definito come il terzo pilastro della programmazione orientata agli oggetti, dopo l'incapsulamento e l'ereditarietà. polimorfismo è una parola greca che significa "molti-shaped" ed ha due aspetti distinti:

  1. In fase di esecuzione, oggetti di una classe derivata possono essere trattati come oggetti di una classe base in luoghi tali come parametri del metodo e collezioni o array . Quando si verifica ciò, il tipo dichiarato dell'oggetto non è più identico al suo tipo di runtime.

  2. classi base possono definire ed attuare metodi virtuali, e derivato classi li ignori, che quindi forniscono loro definizione e attuazione. In fase di esecuzione, quando il codice client chiama il metodo , il CLR cerca il tipo run-time di un oggetto, e invoca che di override del metodo virtuale. Così nel codice sorgente si può chiamare un metodo su una classe di base, e causare la versione di una classe derivata di il metodo da eseguire.

Una volta capito questi concetti meglio si potrebbe essere in grado di determinare se il metodo si sta creando dal libro deve essere virtual o meno.

0

Da documenti

La parola virtuale viene utilizzato per modificare un metodo, una proprietà indicizzatore o dichiarazione di evento, e permettono di essere sovrascritta in una classe derivata.

Quindi se hai bisogno di nascondere vecchie funzionalità e aggiungerne una nuova puoi usare virtuale. Le diverse applicazioni hanno bisogno differenza requrementce secondo su sviluppo di nuovi moduli e l'architettura ..

Vedi qui http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

1

Vedi virtual (C# Reference) . L'aggiunta della parola chiave virtual consente di escludere la proprietà nelle classi derivate, il che è molto probabile quando si creano le classi base generalizzate di un'app MVC.

4

Ok, quindi il termine virtuale, è fondamentalmente significa "ridefinita" (ha implementazione di base), ma non astratto (ciò significa che nessun implementazione originale).

La parola chiave 'virutal' è nessisary se si desidera che qualcuno di ignorare il metodo o proprietà, invece di 'nascondere' esso.

Quindi questo vale per l'ereditarietà e il polimorfismo. Una classe derivata può sovrascrivere un metodo virtuale e renderlo di propria implementazione (o anche chiamare l'implementazione di base in quel metodo). Sovrascrivendo, puoi garantire che il tuo nuovo metodo verrà chiamato polimorficamente, anziché l'implementazione di base.

Inversamente, utilizzando la "nuova" parola chiave, è possibile "nascondere" dati membri e metodi. Ciò ti consentirà anche di eseguire la tua implementazione, ma NON eseguirà la tua nuova implementazione in modo polimorfico, utilizzerà l'implementazione della classe base.

Virual Keyword

Versioning with the Override and New Keywords (C# Programming Guide)

0

assicura virtuali che hanno ereditato le classi i bambini hanno la precedenza la classe base imponendo loro di sovrascrivere la proprietà. Senza di essa la parola chiave virtuale, un oggetto figlio non può sovrascrivere la funzionalità di base.

4

La ragione che egli utilizza la parola chiave virtuale nel suo modello è quello di consentire Change Tracking proxies. Questo è qualcosa di specifico per Entity Framework (edit: anche NHibernate, e possibilmente qualsiasi altro orm grazie a @danludwig), e consente a EF di gestire automaticamente le entità che stai mappando al database.

Da MSDN:

Ogni proprietà mappata a una proprietà di un tipo di entità nel modello dei dati deve avere non saldata (NotOverridable in Visual Basic), pubblico, e virtuale (Overridable in Visual Basic) ottenere e impostare gli accessor .

+0

È inoltre necessario contrassegnare le proprietà come 'virtuali' in NHibernate, quindi tecnicamente non è specifico per EF. Anche NHibernate utilizza i proxy dinamici per la gestione FK e gli scopi di caricamento di proprietà desiderose/pigri. – danludwig

6

Qualcuno potrebbe spiegare a me:

  1. Lo scopo del termine 'virtuale' in questo particolare contesto

    Altri utenti qui risposto così bene con ottime referenze.

  2. L'utilizzo di "virtuale" è necessario?

    Dipende. A volte è necessario, a volte è superfluo.

  3. Perché alcune persone usano "virtuale" e altre no?

    Lo usano quando ne hanno bisogno o quando pensano di averne bisogno.

  4. Perché alcune persone utilizzano "virtuale" solo quando definiscono chiavi esterne?

    Quando si definiscono chiavi esterne da utilizzare con strumenti di mappatura relazionale oggetto come Entity Framework e NHibernate, virtual è spesso necessario perché questi strumenti ORM creano dinamicamente una nuova classe che eredita dalla classe. Queste classi "proxy dinamici" sovrascrivono le proprietà virtual per fornire ulteriore comportamento necessario per mantenere la coerenza della chiave esterna. Nel caso di NHibernate, tutte le proprietà (non solo le chiavi esterne) devono essere contrassegnate con virtual. Questo perché i proxy dinamici NH aggiungono un comportamento personalizzato per decidere quali proprietà sul modello recuperare dal database e quali evitare il caricamento.

  5. Qual è l'uso migliore del termine "virtuale"?

    Utilizzarlo quando si desidera che un membro (metodo o proprietà) venga sovrascritto in una classe derivata più. Non usarli in classi contrassegnate con sealed.

Problemi correlati