Virtual,abstract .NET

di il
48 risposte

Virtual,abstract .NET

Salve a tutti, vorrei qualche chiarimento sulle funzioni virtuali , classi astratte e metodi virtuali puri nel .NET.
Grazie mille a tutti

Modifica:

anche la differenza tra classi astratte e interfacce

48 Risposte

  • Re: Virtual,abstract .NET

    Iniziamo dalla classe astratta, è una classe che non puo essere istanziata ma serve solo come base per altre classi. si dichiara in questo modo:
    
    abstract class MyClass
    {
       ...
    }
    
    Uso il C# come sintassi, ma i concetti sono identici per il VB.

    Un esempio di classe astratta potrebbe essere una classe 'Database' che implementa un po di metodi generici per la gestione di un db ma non è specifica per nessun formato particolare e quindi non ha senso istanziarla. Da questa si derivano ad esempio le classi 'MySqlDb' o 'AccessDb' che sanno come aprire il db in questione.

    In NetFramework la classe astratta non è da confondere con l' 'interfaccia' (di cui parliamo dopo) mentre in C++ i due concetti coincidono.
  • Re: Virtual,abstract .NET

    Ciao barba, scusa ma mi potresti fare un esempio pratico delle classi abstract,però non riesco a capirne l'utilità
  • Re: Virtual,abstract .NET

    Ti devi mettere dal punto di vista di chi scrive una classe di libreria, cioe una classe che potrà essere usata in progetti diversi con esigenze diverse.

    Supponi di scrivere una classe che fa quasi tutto quello che deve fare tranne qualche aspetto essenziale che potrebbe essere fatto in modi diversi.

    Ad esempio, protresti creare una classe che manipola in qualche modo dei dati (ad esempio un elenco di utenti) e che fornisce un mucchio di funzioni utili, però non specifichi come questi dati vengono ottenuti, ad esempio in un progetto vorresti leggere un database, in un altro leggre un file di testo, in un terzo preferisci il file XML ecc. In questo caso lasci astratto il metodo che si occupa della lettura ed in ogni progetto derivi una classe specifica, ad esempio:
    
       abstract class MyUsers
        {
            protected List<string> m_users = new List<string>();
    
            protected abstract void LoadUsers();
    
            public string GetUserList()
            {
                StringBuilder sb = new StringBuilder();
                foreach (string s in m_users)
                {
                    sb.AppendLine(s);
                }
                return sb.ToString();
            }
    
            public bool UserExists(string name)
            {
                foreach (string s in m_users)
                {
                    if (s == name)
                        return false;
                }
                return true;
            }
    
           // ecc.
        }
    
        class MyUsersVersion1: MyUsers
        {
            protected override void LoadUsers()
            {
                // apro un database e con una query ottengo la lista degli utenti
            }
        }
    
        class MyUsersVersion2 : MyUsers
        {
            protected override void LoadUsers()
            {
                // apro un file di testo e leggo la lista degli utenti
            }
        }
    
    
    In un caso del genere la classe base potrebbe anche non essere stata astratta e il metodo LoadUsers essere semlicemente virtuale o voto o con una implementazione qualsiasi. Però una classe del genere potrebbe sarebbe pressoche inutile, rendendola abstract impedisci che l' utente la istanzi per sbaglio e la usi in maniera errata.

    Nel NetFramework molte classi di libreria sono astratte ad esempio TextReader, DbConnection, XmlNode ecc.
  • Re: Virtual,abstract .NET

    Ok quindi le classi astratte sono più o meno una questione di sicurezza

    a)se la classe non è astratta posso inserirci dei metodi astratti?

    b)mettedo il metodo virtuale cosa cambiava?cioè il virtual serve solo per poter fare l'overriding in un'altra classe; perchè nel tuo esempio faccio l'overriding anche se il metodo non è virtuale?mettendo il metodo abstract diventa anche automaticamente virtual?
  • Re: Virtual,abstract .NET

    Una classe astratta puo non avere metodi astratti (semplicemente serve ad impedire di poter istanziare la classe), se però una classe contiene un metodo abstract, allora anche la classe deve essere dichiarata abstract.

    Se un metodo è dichiarato abstract automaticamente è anche virtual.
  • Re: Virtual,abstract .NET

    Ok,una curiosità, in .NET perchè quando si fa l'overriding di un metodo virtual/abstract, perchè poi bisogna mettere "override"? è solo una questione di sintassi o c'è altro; no perché se un metodo dovrà essere riscritto non basta mettere solo abstract/virtual per informare il compilatore?
  • Re: Virtual,abstract .NET

    In C++ è come dici tu, una volta che hai scritto virtual non è necessario scrivere più niente nella classe derivata.

    Questo espone ad un piccolo ma insidioso problema, se il nome della funzione che stai ridefinendo per distrazione non è scritto esattamente come quello delle classe base non te ne accorgi perchè semplicemente stai introducendo una nuova funzione.

    Invece dato che devi scrivere override, qualora il nome non esistesse nella classe base il compilatore ti avvisa, quindi è ridondante ma utile.

    Poi invece che 'override' c' è anche la possibilità di scrivere 'new', ma questa cosa non mi è mai piaciuta per cui non te ne parlo
  • Re: Virtual,abstract .NET

    A ok,ottime curiosità!
    invece per quanto riguarda le interfacce,cosa cambia rispetto alle abstract?
  • Re: Virtual,abstract .NET

    Che bello un po di teoria, mi aggiungo alla discussione!
    Le interfacce non implemetano alcun metodo o proprietà ma servono a stipulare un contratto con la classe derivata.
    Nelle interfacce vengono dichiarati i metodi non implementati ma che la classe derivata implementerà.
    Le interfacce possono essere estese tramite il meccanismo dell'ereditarietà e rispetto alle classi (quelle di .Net) possono sfruttare l'ereditarietà multipla.
  • Re: Virtual,abstract .NET

    Ok, grazie mille, invece per quanto riguarda il c++ che barba prima ha detto che le cose coincidevano, in che senso? Eppoi visto che le cose sono abbastanza simili quando conviene usare un'interfaccia rispetto a un abstract e viceversa? Grazie mille ancora per la disponibilitá e pazienza
  • Re: Virtual,abstract .NET

    Grazie mille ancora per la disponibilitá e pazienza.
    Figurati, ci stiamo divertendo un sacco.

    In C++ non esiste la parola chiave 'interface' e neppure 'abstract', esiste solo la possibilità di dichiarare che un metodo virtuale non viene implementato aggiungendo alla fine '=0;'.
    
    virtual void MyFunc() = 0;
    
    Un metodo del genere vieme chiamato 'metodo virtuale puro', e la classe che lo contiene 'classe astratta', una classe del genere non può essere istanziata. In C++ non esistono le interfacce però una classe astratta in cui tutti i metodo sono virtuali puri sopperisce a questa mancanza e funge da interfaccia.

    Però sono due concetti diversi, e infatti in C# vengono separati. Una classe astratta è una classe che non vuoi che venga istanziata, una interfaccia è qualcosa che definisce un contratto come ti ha spiegato Toki.
  • Re: Virtual,abstract .NET

    A ecco ,più o meno capito la differenza tra le due. Ho notato una cosa però , in ambienti c++, chiamiamoli "normali",le parole chiavi "interface" e "abstract" non ci sono, mentre in visual c++ .net esistono, com'è questa cosa? Hanno un altro significato oppure è lo stesso?
  • Re: Virtual,abstract .NET

    Personalmente aborrisco il C++ NetFramework.
    Uno dei pregi del C++ (quello giusto) è la portabilità, se cominci ad aggiungergli parole chiavi ed estensioni non è più C++. A quel punto tanto vale fare le cose per bene e fare un nuovo linguaggio tipo il C#.
  • Re: Virtual,abstract .NET

    In che senso la portabilità, cosa cambia?
Devi accedere o registrarti per scrivere nel forum
48 risposte