Come e perché i modificatori di classe dovrebbero applicare o impedire l'ereditarietà e la capacità di ignorare

4

Questo non è realmente correlato a qualcosa a cui sto lavorando attualmente, è più una domanda per la quale non sono riuscito a trovare una risposta.

I modificatori di classe come MustInherit o NotOverridable per me, sembrano come se dovessero essere usati solo in programmi più grandi che hanno più persone che lavorano e lo modificano.

Riesco a vedere in una situazione del genere quanto sia importante forzare o impedire che le persone ereditino o eseguano l'override, ma nei programmi più piccoli non vedo perché o se verrebbero utilizzati.

Questo è fondamentalmente ciò che questi modificatori sono o mi manca lo scopo di loro.

    
posta Daniel Whittaker 11.11.2014 - 19:41
fonte

2 risposte

7

I can see in a situation like that how forcing or preventing people to inherit or override makes sense, but in smaller programs I just don't see why or if these would be used.

Questo ("Oh, è solo un piccolo programma a cui sto lavorando da solo, e so cosa sto facendo.") è un errore.

C'è stato un bel po 'di ricerche che hanno scoperto che le persone possono tenere a mente solo una certa quantità di cose alla volta. Costringendo te stesso a ricordare se quella funzione è sovrascrivibile o meno, è una cosa in meno che puoi spendere per qualcosa di utile, come il problema in questione. E anche se lo ricordi (il programma è piccolo, dopotutto), allora stai spendendo energia per tenerlo a mente - il che significa che spendi meno tempo a programmare o sei più stanco dopo aver finito.

E diciamo i fatti, le persone non ricordano cose migliori mentre avanzano nell'età adulta. Anche se riesci a ricordare tutti i dettagli di questo programma oggi, che dire di un anno da oggi? Tra 5 anni? È bello prendere l'abitudine ora.

E che ignora il fatto che tu sia umano (presumo). Le persone commettono errori Marcando qualcosa come astratto o sigillato, lasci che il computer agisca come una rete di sicurezza in modo da non andare fuori ed estendere il tuo design di classe in modi terribili semplicemente perché hai pensato erroneamente che potresti / dovresti.

    
risposta data 11.11.2014 - 20:13
fonte
0

Risposta rapida

I modificatori di ereditarietà dei membri consentono agli sviluppatori di inserire le linee guida su come ereditare i membri di un oggetto.

Risposta lunga, noiosa, estesa

La combinazione di metodi non virtuali e metodi virtuali (e metodi "finali" o "sigillati" e "astratti"), in un algoritmo, consente di limitare un obiettivo.

Ricorda che questi modificatori possono variare da una lingua di programmazione a un'altra P.L.

  • MustInherit di V.B. è comunemente usato come virtual , in altri P.L.
  • Overriden di V.B. è comunemente usato come override , in altri P.L.
  • NotOverridable di V.B. non è usato esplicitamente in molti P.L., di solito aggiungo un piccolo commento di una riga come /* nonvirtual */ .

In Java, prima che venisse aggiunto l'indicatore @override o la direttiva, ho usato /* @override */ .

Sviluppo un sacco di O.O. programmi, di solito fatti interamente da me stesso, la maggior parte per lavoro, a volte per hobby. Anche nei piccoli programmi aggiungo i modificatori, perché la logica del programma richiede.

Un buon esempio, è quando ne combini diversi:

public class EntityClass
{

        public virtual bool IsReady()
        {
            bool Result = false;

            // depends on the class

            return Result;
        } // bool IsReady()

        public virtual bool GenerateKey()
        {
            bool Result = false;

            // depends on the class

            return Result;
        } // bool GenerateKey()

        public virtual bool BeforeInsert()
        {
            bool Result = false;

            // depends on the class

            return Result;
        } // bool BeforeInsert()

        public virtual bool ConfirmedInsert()
        {
            bool Result = false;

            // depends on the class

            return Result;
        } // bool ConfirmedInsert()

        public virtual bool AfterInsert()
        {
            bool Result = false;

            // depends on the class

            return Result;
        } // bool AfterInsert()

        public /* nonvirtual */ bool InsertAndGenerateKey()
        {
            bool Result = false;

            if (this.IsReady())
            {
                Result = GenerateKey();
                if (Result)
                {
                    Result = BeforeInsert();
                    if (Result)
                    {
                        Result = ConfirmedInsert();
                        if (Result)
                        {
                            AfterInsert();
                        }
                    }
                }
            } // if (this.IsReady())

            return Result;
        } // bool InsertAndGenerateKey

        public /* nonvirtual */ bool InsertAndIgnoreKey()
        {
            bool Result = false;

            if (this.IsReady())
            {
                Result = BeforeInsert();
                if (Result)
                {
                    Result = ConfirmedInsert();
                    if (Result)
                    {
                        AfterInsert();
                    }
                }
            } // if (this.IsReady())

            return Result;
        } // bool InsertAndIgnoreKey(...)

        public /* nonvirtual */ bool InsertWithAssignedKey()
        {
            bool Result = false;

            if (this.IsReady())
            {
                Result = BeforeInsert();
                if (Result)
                {
                    Result = ConfirmedInsert();
                    if (Result)
                    {
                        AfterInsert();
                    }
                }
            } // if (this.IsReady())

            return Result;
        } // bool InsertWithAssignedKey(...)

} // class EntityClass

In questo esempio in C #, ci sono diversi metodi, parte di una singola classe.

Verifica che i metodi non virtuali combinati, di solito chiamano altri metodi virtuali.

Questa combinazione, limitata dai modificatori, definisce un processo, chiamato "Strategy Design Pattern", che ha un obiettivo, ma, tuttavia, consente, alcune personalizzazioni per sottoclassi.

    
risposta data 11.11.2014 - 20:13
fonte

Leggi altre domande sui tag