Domande sul polimorfismo

2

Quindi capisco l'importanza del polimorfismo, compreso quanto sia vitale. Ma qualcosa che non capisco è ciò che riguarda il Constructor e qualsiasi% co_de ereditato% che potrebbe avere l'iniziale Class .

Ad esempio, ho una classe per testare alcuni criteri: livello dell'account, versione di Windows e altri controlli.

// Base Class
public class CheckInstalled : CheckUserLevel
{
       public CheckInstalled()
       {
             // Check verify the CheckUserLevel token is true, if it isn't throw an exception and close.
             if (!(_level == true))
             {
                    // The above implementation would technically go here.
             }
        }

        public virtual void IsInstalled()
        {
             // Implementation of initial check of general software.
        }
}

Quindi in teoria sarebbe il Base Class che farà un controllo generico; ma ci sono altre applicazioni che devo testare se sono installate. Quindi ora creerei un Base Class per:

  1. Sql
  2. IIs
  3. Dnn

O qualsiasi cosa tu possa aver bisogno di assicurarsi sia selezionata. Quindi per ognuno di questi Class erediterei Classes . In ognuno avrei questo:

public override void IsInstalled()
{
      // Implementation to check for that specific Class Item is installed.
}

Quindi vedo come Polymorphism semplificherà davvero e manterrà ognuno di questi CheckInstalled Class separato. Ma fornirà quella flessibilità per l'Orientamento agli oggetti.

La radice della mia domanda, Classes contiene quel valore di token ereditato. Ma fai tutto il resto Base Class Constructor che eredita il valore? Essenzialmente che Classes viene eseguito in modo coerente? O il token Base Class Constructor deve essere chiamato in ogni?

Speriamo che abbia senso. In caso contrario, fammi sapere e proverò a riformularlo.

Aggiornamento:

Il _level è invocato qui:

class CheckUserLevel
    {

        // Token Bool:
        private bool _level = false;

        #region Constructor:

        protected CheckUserLevel()
        {

            // Invoke Method On Creation:
            Elevate();

        }

        #endregion

        public void Elevate()
        {

            // Get Identity:
            WindowsIdentity user = WindowsIdentity.GetCurrent();

            // Set Principal
            WindowsPrincipal role = new WindowsPrincipal(user);

            #region Test Operating System for UAC:

            if (Environment.OSVersion.Platform != PlatformID.Win32NT || Environment.OSVersion.Version.Major < 6)
            {

                // False:
                _level = false;

                // Todo: Exception/ Exception Log

            }

            #endregion

            else
            {

                #region Test Identity Not Null:

                if (user == null)
                {

                    // False:
                    _level = false;

                    // Todo: "Exception Log / Exception"

                }

                #endregion

                else
                {

                    #region Ensure Security Role:

                    if (!(role.IsInRole(WindowsBuiltInRole.Administrator)))
                    {

                        // False:
                        _level = false;

                        // Todo: "Exception Log / Exception"

                    }

                    else
                    {

                        // True:
                        _level = true;

                    }

                    #endregion


                } // Nested Else 'Close'

            } // Initial Else 'Close'

        } // End of Class.

    }

La classe separata genera effettivamente il valore booleano; ogni volta che viene richiamata la classe, assegnerà un valore ad essa. Non volevo esporre troppo con questa classe principalmente per il suo ruolo nel test di amministrazione.

Il problema:

Several methods will require Administrative Permission; my thought was to inherit on the base CheckInstalled. Which in it's creation will automatically check the boolean state of _level. Then from that point; this CheckInstalled can be inherited to other classes; then I can simply override IsInstalled to bend to the desired task for that item.

Questo è un pensiero negativo da parte mia?

    
posta Greg 01.02.2013 - 18:24
fonte

2 risposte

4

Due punti; In primo luogo, il costruttore dovrebbe essere generalmente utilizzato solo per la configurazione iniziale. Nel tuo caso caricare qualsiasi dipendenza e simili, senza effettuare il controllo effettivo.

In secondo luogo (e soprattutto) l'ereditarietà dovrebbe essere usata in un caso in cui è possibile condividere il codice tra classi simili. Questo caso dosent promuove il riutilizzo del codice. È un ottimo candidato per l'utilizzo dell'interfaccia, è possibile definire un'interfaccia con CheckInstalled (), quindi è possibile disaccoppiare l'implementazione specifica. (per ulteriori informazioni dai un'occhiata al modello di strategia )

    
risposta data 01.02.2013 - 19:08
fonte
0
// Base Class
internal class CheckInstalled : CheckUserLevel
{        
    public CheckInstalled()
    {
        // Check verify the CheckUserLevel token is true, if it isn't throw an exception and close.
        if (!Verified)
         {
                // The above implementation would technically go here.
         }
    }

    public virtual void IsInstalled()
    {
        // Implementation of initial check of general software.
    }
}

internal class CheckUserLevel
{
    //Derived classes inherit the Verified property
    public bool Verified {get;set;}//Verified is more indicative of the action.  _level implies an enumeration of sorts        

    public CheckUserLevel()//the base constructor is called prior to the derived constructor.          {
        Verify();//Caution: long running operations should not go in constructors
    }

    private void Verify()
    {
        bool verified = true;
        //do work

        Verified = verified;
    }
}

Il costruttore di base viene chiamato ogni volta che viene creata un'istanza di una classe derivata. Per questo e altri motivi, CheckUserLevel dovrebbe essere una relazione has-a. In altre parole, CheckuserLevel dovrebbe essere un membro di CheckInstalled.

Tuttavia, poiché sembra che non desideri associare la verifica alla costruzione ...

Or does the _level token have to be called in each?

... un membro statico ha più senso.

In altre parole converti in:

// Base Class
internal class CheckInstalled
{        
    public CheckInstalled()
    {
        // Check verify the CheckUserLevel token is true, if it isn't throw an exception and close.
        if (!CheckUserLevel.Verified)
         {
                // The above implementation would technically go here.
         }
    }

    public virtual void IsInstalled()
    {
        // Implementation of initial check of general software.
    }
}

internal class CheckUserLevel
{        
    public static bool Verified {get;set;}        

    static CheckUserLevel()
    {
        Verify();
    }

    private static void Verify()
    {
        bool verified = true;
        //do work

        Verified = verified;
    }
}
    
risposta data 01.02.2013 - 19:31
fonte

Leggi altre domande sui tag