Forskel på 'static class' og 'abstract class'

Tags:    .net

Hej,

Jeg har funderet en smule over det nu, og jeg kan godt se, at der er små, umiddelbare forskelle på en statisk klasse og en abstrakt klasse (eksempelvis fejlmeddelelserne når man prøver at implementere en ikke-statisk metode i den statiske/abstrakte klasse), men hvad er den praktiske forskel? Hvilke muligheder har det ene i forhold til det andet?

Jeg snakker selvfølgelig om at skrive noget i stil med:

Fold kodeboks ind/udKode 


Redigering: Jeg har nu fundet ud af, at en abstrakt klasse kan arves fra, og det kan en statisk ikke. Men der er muligvis flere forskelle, så jeg lukker ikke tråden.



Thomas



Indlæg senest redigeret d. 03.09.2009 02:11 af Bruger #8985
3 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Der er store forskelle på de 2 - her er idéen med begge typer:

Abstrakt klasse
Denne klasse er speciel idet at du ikke kan oprette en instans af den. Meningen med den er at du kan kode noget basis kode, som evt. afhænger af en eller anden reel implementering som du ikke kan kende i basis-koden, men du ved hvilken signatur den skal have. Du kan herefter lave en abstrakt metode inden i klassen - som blot er signaturen uden den egentlig kode. Dvs. al din "boiler-plate" kode kan stadig kompillere idet den ikke referer en ukendt metode men du kan så ikke instanciere klassen. Når man så arver fra den abstrakte klasse, hvis man ikke vil lave endnu en abstrakt klasse så skal man implementere de(n) abstrakte metode(r) (og gøre det via override i C# eller tilsvarende keyword i VB.Net). Dette betyder altså at de abstrakte metoder er virtuelle og derved vil al "boiler-plate" koden nu køre idet der nu findes en reel implementering til de(n) abstrakte funktioner.

Statisk klasse
En statisk klasse er kort sagt en klasse som man ikke kan have en instans af - på nogen måde heller ikke gennem nedarvning. Ydermere kan den også kun have statisk indhold (static keyworded i C#) og derfor giver det ingen mening at arve fra den da du ikke vil arve noget når der kun er statiske elementer i spil.



Tak for dit hurtige og uddybende svar, Kaare. Jeg har lige siddet og leget lidt med noget af det du sagde om abstrakte klasser. Betyder det, at abstrakte metoder er C#'s svar på virtuelle metoder? Det voldte mig fx mange problemer alene at skrive 'virtual' i koden. Hvis C#'s abstrakte metoder ikke er lig C++'s virtuelle metoder, hvordan laver jeg så noget i stil med dette i C#?

virtual void funktion();

og måske også

virtual void funktion() = 0;







t