Abstract & sealed
Abstrakta klasser Vad är en abstrakt klass? En abstrakt klass är en klass där man inte kan skapa några objekt som bara tillhör den klassen. Däremot går det att skapa objekt av dess härledda klasser. en abstrakt basklass är alltså en ren basklass, referenser av den typen kan finnas, men inte objektet. abstract class Shape { …. }
Abstrakta klasser Designdilemma i OOP Lösning Basklasser ska vara abstrakta, tidlösa, allmänna och utan konkreta detaljer. Härledda klasser ska vara konkretiseringar med alla nödvändiga implementationsdetaljer. Men samtidigt vill man använda basklassreferenser för att på ett generellt sätt hantera objekt av härledda klasser, och då måste ju de medlemmar som ska anropas finnas i basklassen. Lösning Att i basklassen ha ett antal metoder som finns där bara till namnet, enbart för att kunna anropas via basklassreferenser. Dessa metoder kallas för ”placeholder” och består av metoder utan implementation abstrakta metoder.
Abstrakta metoder abstract class Shape { public abstract double Area(); } En abstrakt metod har ingen kropp och därmed ingen implementation. Implementationen ersätts av ett semikolon. Det är endast tillåtet att deklarera abstrakta metoder i en abstrakt klass. D.v.s. en abstrakt metod tvingar klassen att vara abstrakt men inte tvärtom. I en abstrakt klass kan finnas icke abstrakta metoder. En abstrakt metod är implicit virtuell och måste därför implementeras med en override metod i alla härledda klasser. den abstrakta metoden måste implementeras i härledd klass, annars blir även den klassen abstrakt.
Abstrakta metoder abstract class Shape { public abstract double Area(); } class Circle: Shape private int radius; public int Radius get { return radius; } set { radius = value; } public override double Area() return System.Math.PI * radius * radius;
Abstrakta egenskaper Det går att deklarera egenskaper som abstrakta i en abstrakt klass. Implementationen för get och set ersätts med en semikolon. I en härledd klass måste dessa egenskaper markeras override.
Abstrakta egenskaper abstract class Shape { public abstract double Area(); public abstract int X { get; set; } public abstract int Y { get; set; } } class Circle: Shape private int radius; private int x; private int y; public override int X get { return x;} set { x = value;} public override int Y get { return y; } set { y = value; } public int Radius get { return radius; } set { radius = value; } public override double Area() return System.Math.PI * radius * radius;
Abstrakta klasser För att dra detta tänkande ytterligare ett steg kan man tänka sig basklasser som enbart är avsedda att vara paket av abstrakta metoder och egenskaper. En slags standarsuppsättningar av metodnamn / egenskapsnamn som används som basklasser och därmed ger flera av härledda klasser ett slags standardutseende – ett gemensamt gränssnitt.
Sealed klass För att skapa en klass som hindrar andra klasser att ärva ifrån den då markeras klassen med nyckelordet sealed. D.v.s. sealed klass kan aldrig vara en basklass till ngn annan klass. Om ngn klass försöker ärva från en sealed klass, då genereras ett kompileringsfel. En sealed klass kan inte deklarera en virtuell metod. Det går att deklarera en metod som sealed. Detta betyder att den härledda klassen inte kan skriva om implementationen för den sealed metoden.
En abstakt metod presenterar namnet på en metod. Ingen implementation En virtuell metod är den första implementeringen av en metod. En override metod är ytterliggare en implementering av en metod. En sealed metod är den sista implementeringen av en metod.