2010-08-09 20 views
9

Sono sorpreso di sapere che una classe astratta in C# non può avere alcun metodo astratto.Classe astratta senza alcun metodo astratto

abstract class AbstractDemo 
{ 
public void show() 
    { 
    Console.WriteLine("In Show Method"); 
    } 
} 
class MainDemo:AbstractDemo 
{ 
public static void Main() 
{ 
    Console.WriteLine("In Main Method"); 
} 
} 

Qualche spiegazione?

risposta

20

A volte non si vuole dare la possibilità di creare un'istanza di una classe, ma questa classe è necessaria come classe base per altre classi.

La ragione per cui si scelgono le classi astratte tramite le interfacce è che è possibile fornire un'implementazione di base.

+0

Okay, questo significa che possiamo usare una classe astratta come una classe di marcatori per altre classi. –

+0

Sì, in effetti, ma se non è necessaria un'implementazione, è possibile utilizzare invece le interfacce. –

0

Se la classe è solo una base per altre classi e non ha una piena utilizzabilità, in altre parole come base, non è possibile utilizzarla, quindi si desidera impedire la creazione di istanze di esso. In questo caso puoi creare una classe astratta senza membri astratti.

2

Penso che tu stia confondendo le classi astratte con le interfacce. Le interfacce non possono avere metodi con il corpo, le classi astratte possono. Ci sono momenti in cui si desidera impedire all'utente di creare un'istanza di un oggetto di una classe specifica; ma forniscono ancora alcune funzionalità di base per le classi che ne derivano; questo è ciò per cui è utile una classe astratta.

+0

Che dire di una classe astratta con assolutamente nessun metodo. Nemmeno la definizione. –

+0

@Nadeem In questo caso è quasi la stessa di un'interfaccia "marker" (cioè senza niente, solo per contrassegnare una classe, si noti che FxCop suggerisce invece di utilizzare Attributi). La differenza è che puoi avere solo una classe base (come la tua "classe astratta marcatore"), ma puoi implementare molte interfacce. Quindi in tal caso un'interfaccia di solito è migliore. –

+0

Sì, ma supponiamo di voler avere alcuni attributi della classe e, se usiamo l'interfaccia, per impostazione predefinita saranno pubblici e violeranno il principio di occultamento dei dati di base di OOPS. –

1

Una classe astratta è una classe che deve essere estesa prima di poter essere utilizzata. Ciò non significa in alcun modo che le funzioni stesse debbano essere astratte.

Prendiamo ad esempio una classe di animali

public abstract class Animal 
{ 
    void Move() 
    { 
     //whatever 
    } 
} 

public class Fish : Animal 
{ 
    void Swim() 
    { 

    } 
} 

public class Dog : Animal 
{ 
    void Bark() 
    { 

    } 
} 

Tutti gli animali possono muoversi, ma solo i pesci possono nuotare e il cane può abbaiare.

O per un esempio di vita reale. Ho un controller base ASP.net MVC che utilizzo nella mia applicazione. Ha alcuni metodi di base che mi servono molto spesso come GetCurrentUser() e una funzione che ho scritto per aiutare con la localizzazione. Si occupa anche del tracciamento, quindi non devo riscrivere quel codice in tutti i miei controller. La classe ha circa 200 righe di codice ma non un singolo metodo astratto.

+7

In realtà, penso che scoprirai che la maggior parte dei cani può nuotare;) –

+2

Un buon punto, avrebbe dovuto trovare un altro animale :) – Sruly

11

Questo è interamente valido e occasionalmente utile se si desidera fornire un comportamento simile a un evento: fornire una classe astratta con tutti i "gestori di eventi" implementati come metodi virtuali con un comportamento predefinito di non fare nulla.

Una classe derivata può quindi eseguire l'override di alcuni dei metodi, ma non è necessario sovrascriverne uno specifico, perché nulla è astratto. Ha ancora senso che la classe sia astratta perché un'istanza della classe base sarebbe inutile (dato che tutto sarebbe un no-op).

Questo schema è molto più comune in Java rispetto a C#, tuttavia, come in C# normalmente si utilizzano solo eventi "corretti".

0

È possibile utilizzare una parola chiave astratta su una classe solo per segnalare al compilatore che può essere utilizzata solo ereditando da essa e non direttamente; In questo caso non sei obbligato a mettere membri astratti nella classe.

Ciò equivale a inserire nella classe un solo costruttore protetto, ma l'uso dell'estratto è più chiaro e comprensibile.

0

No spiegazione migliore di MSDN è di per sé http://msdn.microsoft.com/en-us/library/aa645615(v=VS.71).aspx

  • Una classe astratta non può essere istanziata direttamente, ed è un errore di fase di compilazione di utilizzare il nuovo operatore una classe astratta. Mentre è possibile avere variabili e valori il cui tempo di compilazione tipi sono astratti, tali variabili e valori saranno necessariamente essere sia nullo o contenere riferimenti ai casi di classi derivate non astratte dalle tipi astratti.
  • Una classe astratta è consentita (ma non obbligatoria) per contenere membri astratti .
  • Una classe astratta non può essere sigillata.
0

Abbiamo sentito che in classe astratta deve esserci un membro abstarct. Ma quando compilo la classe abstarct senza un metodo astratto, compila. Mi dà sorpresa. Ora non riesco a trovare l'articolo che spiega il comportamento esatto di una classe di abstarct.

+0

Forse confonderai C++ e C# ... – Ants

Problemi correlati