Permalänk
Medlem

C#: Interface vs abstract

En abstract class kan man ju bara ärva från, dvs man skapar aldrig en instans av basklassen och används ju därför som en slags mall för andra underklasser.

En interface används ju också som en mall för andra klasser.

Hoppas någon med större insikt än jag förstår vad jag försöker säga

Men min fråga är alltså vad som egentligen skiljer dessa åt, varför har man slängt in Interface alls då det borde räcka med att ärva från en abstract klass?

Jag har läst i olika böcker, på nätet osv men poletten trillar inte ner. I mina ögon är dom så gott som likställda. När skulle du använda en abstact klass istället för ett interface och vice versa?

Permalänk
Medlem

I en abstrakt klass kan du implementera saker. Det kan du inte i ett interface.

Visa signatur

AMD Mobile 2400+ @ 2300 Mhz (11,5x200) 1,625 V, Gf4 Ti 4200 @ 360/760, 512mb SP bh-5, Vmodds, vatten och TEC på gpu.

Permalänk

En abstrakt klass kan du använda för att specifiera något som är abstrakt. T.ex. ett fordon. Ett fordon i sig är ingenting, men alla fordon delar vissa basegenskaper och metoder.

Ett interface kan du använda som ett kontrakt för att lova att din klass implementerar en metod. T.ex. loggning. En klass kanske loggar till standard output medans en annan loggar till fil. Det enda den som använder klasserna behöver veta är att de implementerar samma interface och därmed har en metod typ log().

Visa signatur

Om man tänker en tanke, så är den tanken inte den tanke man tror att man tänker. Utan det är den tanke som får en att tro att man tror den tanke man tror att man tänker.

Permalänk
Hedersmedlem

Dessutom kan en klass implementera flera interfaces men bara ärva från en klass (abstrakt eller ej).

Visa signatur

The variable 'brain' is declared but never used

Permalänk
Medlem

Tack för svaren, nu börjar det klarna.

Särskilt det Prize skrev om att

Citat:

Ett interface kan du använda som ett kontrakt för att lova att din klass implementerar en metod.

Smidig funktion också i Visual Studio att "Implement interface" i klassen så att massa kod genereras, den funktionen finns inte vad jag kan se för ärvda klasser.

Permalänk
Medlem

Sen om du har ett system som hanterar mördarbävrar, mördarkaniner och mördartigrar, och kaninungar, som alla är subtyper till supertypen djur, där alla djur utom kaninungar har en viss "farlighet", som räknas ut på nåt lustugt sätt. Då känns det ju rimligare att ha ett interface som heter typ Dödlighet, Skada, you name it, som används av de djur som är farliga. Istället för att kaninungen ska ha en tom metod för skada trots att den inte kan göra någon..

Abstrakta classer kan man väl också använda om man inte vill att man ska kunna skapa några instanser av supertype, iofs kan man väl deklarera konstruktorn som privat isf..

/kej

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Kejsarn
Sen om du har ett system som hanterar mördarbävrar, mördarkaniner och mördartigrar, och kaninungar, som alla är subtyper till supertypen djur, där alla djur utom kaninungar har en viss "farlighet", som räknas ut på nåt lustugt sätt. Då känns det ju rimligare att ha ett interface som heter typ Dödlighet, Skada, you name it, som används av de djur som är farliga. Istället för att kaninungen ska ha en tom metod för skada trots att den inte kan göra någon..

Abstrakta classer kan man väl också använda om man inte vill att man ska kunna skapa några instanser av supertype, iofs kan man väl deklarera konstruktorn som privat isf..

/kej

där skulle jag nog ha kört med

public abstract class Djur

public abstract class MördarDjur : Djur
public abstract int Dödlighet{get;}
public abstract void Kill(Djur offer);
//kanske bättre som virtual med en grundläggande döda-funktionalitet?

public abstract class GrönsaksDjur : Djur
public abstract void Gulla(Djur target);