2010-09-04 20 views
5

Solo una piccola domanda su C++/cli. Le classi astratte hanno metodi astratti da implementare per classi derivate, le classi sigillate non consentono l'ereditarietà.Abstract Sealed Classes

Quindi, perché abbiamo alcune classi nella libreria di classi di base .NET definita come abstract sealed, e si può trovare un sacco .. ??!

+0

Esempi? Questa è una decisione di design interessante per me, quindi volevo vedere quali facevano :) –

+0

http://msdn.microsoft.com/en-us/library/system.math.aspx –

risposta

15

È equivalente a "classe statica" nel linguaggio C#. Il linguaggio utilizzato per scrivere quasi tutte le classi BCL. Tutti i metodi devono essere statici. Dichiararlo astratto e sigillato impedisce a chiunque di derivare dalla classe e crearne un'istanza.

I metodi di classe sono l'equivalente esatto delle funzioni libere nel linguaggio C e C++. Qualcosa che il CLR non supporta.

+0

sono totalmente d'accordo con te, perché assomiglia ad esempio alla classe MATH di JAVA, ma perché la documentazione di msdn dice che questo non è possibile o giusto se lo si può fare ??! –

+0

@Ebraheem Najjar: è possibile farlo direttamente a livello di IL. Il compilatore non ti permetterà di scrivere direttamente una classe 'abstract abstract'. –

+0

Gli attributi IL su una classe sono distinti dalle parole chiave nella lingua. In C#, non ha senso dichiarare una classe sigillata * e * astratta, si lamenterà. Dichiararlo statico è ciò che attiva questi attributi IL. Non esiste un analogo CLR per una classe 'statica'. –

2

non possono astratta e sigillato, non ha senso

Una classe chiusa non può essere utilizzata come classe base. Per questo motivo, non può essere anche una classe astratta. Le classi sigillate impediscono la derivazione. Poiché non possono mai essere utilizzati come classe base, alcune ottimizzazioni in fase di runtime possono rendere i membri della classe sigillati un po 'più veloci.

http://msdn.microsoft.com/en-us/library/ms173150.aspx

+0

intendeva C++/cli. prova public ref class CProperty sealed abstract { }; –

+7

Una classe C# statica è in realtà 'abstract sealed', sebbene non sia possibile utilizzare esplicitamente questi modificatori insieme nel codice. Ma l'OP sta parlando di C++/CLI, dove non esiste un concetto di classe statica –