Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Abstraksjon | OOP-Prinsipper
C# Utover Det Grunnleggende

bookAbstraksjon

Abstraksjon er et grunnleggende konsept innen objektorientert programmering (OOP) som lar deg skjule komplekse implementasjonsdetaljer og fokusere på essensiell funksjonalitet. I C# oppnås abstraksjon gjennom abstrakte klasser.

Note
Merk

OOP var opprinnelig basert på tre prinsipper (noen ganger omtalt som "De tre søylene i OOP"), inkludert innkapsling, arv og polymorfisme. Derfor er abstraksjon en nyere tillegg og regnes ikke alltid som et grunnleggende konsept ifølge enkelte kilder, men det er likevel et viktig konsept.

En abstrakt klasse er en klasse som ikke kan instansieres, noe som betyr at du ikke kan opprette et objekt av denne klassen. En abstrakt klasse kan inneholde attributter og metoder som enhver annen klasse, men den kan også inneholde abstrakte metoder som er malmetoder ment å implementeres av avledede klasser.

Du kan opprette en abstrakt klasse ved å legge til abstract-nøkkelordet foran klasse-definisjonen. For eksempel, la oss opprette en abstrakt klasse kalt Shape:

index.cs

index.cs

copy
12345678910111213141516171819
using System; abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } } class ConsoleApp { static void Main() { Shape s = new Shape(); // Error: Cannot create an instance of an abstract class } }

På samme måte kan du opprette en abstrakt metode ved å legge til nøkkelordet abstract foran returtypen. En abstrakt metode har ingen implementasjon – den fungerer kun som en mal:

index.cs

index.cs

copy
1234567891011
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }

Formålet med dette er å lage en mal for andre klasser. Dette bidrar til å forenkle koden. For å forstå dette bedre, la oss se på oppgaven om polymorfisme fra kapittel 5:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
using System; class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public virtual float getArea() { return 0.0f; } // A virtual method can only be either 'public' or 'protected' protected virtual float calculatorPerimeter() { return 0.0f; } } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } // Area of a Circle = pi . r . r public override float getArea() { return 3.14f * radius * radius; } // Perimeter (or) Circumference: 2 . pi . r protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); Console.WriteLine(r1.getArea()); Console.WriteLine(s1.getArea()); Console.WriteLine(c1.getArea()); } }

I eksemplet ovenfor er det aldri meningen å bruke Shape-klassen direkte, men du måtte likevel skrive noen falske implementasjoner av metodene getArea og calculatePerimeter i Shape-klassen. Du kan forenkle denne koden noe ved å gjøre Shape-klassen abstrakt, og i tillegg kan du gjøre metodene getArea og calculatePerimeter abstrakte.

Note
Merk

En metode kan enten være abstrakt eller virtuell, men ikke begge samtidig. Det er imidlertid viktig å merke seg at en abstrakt metode i bunn og grunn er en virtuell (overstyrbar) metode, men den har ingen implementasjon i basisklassen.

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
using System; using System.Collections.Generic; abstract class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public abstract float getArea(); protected abstract float calculatorPerimeter(); } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } public override float getArea() { return 3.14f * radius * radius; } protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); // We cannot create an instance of 'Shape' but we can use type datatype "Shape" for creating variables, arrays or lists List<Shape> shapes = new List<Shape>(); shapes.Add(r1); shapes.Add(s1); shapes.Add(c1); foreach(Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }

1. Hvilket nøkkelord brukes for å gjøre en klasse abstrakt?

2. Kan en abstrakt klasse instansieres?

question mark

Hvilket nøkkelord brukes for å gjøre en klasse abstrakt?

Select the correct answer

question mark

Kan en abstrakt klasse instansieres?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 8

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 2.04

bookAbstraksjon

Sveip for å vise menyen

Abstraksjon er et grunnleggende konsept innen objektorientert programmering (OOP) som lar deg skjule komplekse implementasjonsdetaljer og fokusere på essensiell funksjonalitet. I C# oppnås abstraksjon gjennom abstrakte klasser.

Note
Merk

OOP var opprinnelig basert på tre prinsipper (noen ganger omtalt som "De tre søylene i OOP"), inkludert innkapsling, arv og polymorfisme. Derfor er abstraksjon en nyere tillegg og regnes ikke alltid som et grunnleggende konsept ifølge enkelte kilder, men det er likevel et viktig konsept.

En abstrakt klasse er en klasse som ikke kan instansieres, noe som betyr at du ikke kan opprette et objekt av denne klassen. En abstrakt klasse kan inneholde attributter og metoder som enhver annen klasse, men den kan også inneholde abstrakte metoder som er malmetoder ment å implementeres av avledede klasser.

Du kan opprette en abstrakt klasse ved å legge til abstract-nøkkelordet foran klasse-definisjonen. For eksempel, la oss opprette en abstrakt klasse kalt Shape:

index.cs

index.cs

copy
12345678910111213141516171819
using System; abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } } class ConsoleApp { static void Main() { Shape s = new Shape(); // Error: Cannot create an instance of an abstract class } }

På samme måte kan du opprette en abstrakt metode ved å legge til nøkkelordet abstract foran returtypen. En abstrakt metode har ingen implementasjon – den fungerer kun som en mal:

index.cs

index.cs

copy
1234567891011
abstract class Shape { protected float circumference; public float getCircumference() { return circumference; } public abstract float getArea(); }

Formålet med dette er å lage en mal for andre klasser. Dette bidrar til å forenkle koden. For å forstå dette bedre, la oss se på oppgaven om polymorfisme fra kapittel 5:

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
using System; class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public virtual float getArea() { return 0.0f; } // A virtual method can only be either 'public' or 'protected' protected virtual float calculatorPerimeter() { return 0.0f; } } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } // Area of a Circle = pi . r . r public override float getArea() { return 3.14f * radius * radius; } // Perimeter (or) Circumference: 2 . pi . r protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); Console.WriteLine(r1.getArea()); Console.WriteLine(s1.getArea()); Console.WriteLine(c1.getArea()); } }

I eksemplet ovenfor er det aldri meningen å bruke Shape-klassen direkte, men du måtte likevel skrive noen falske implementasjoner av metodene getArea og calculatePerimeter i Shape-klassen. Du kan forenkle denne koden noe ved å gjøre Shape-klassen abstrakt, og i tillegg kan du gjøre metodene getArea og calculatePerimeter abstrakte.

Note
Merk

En metode kan enten være abstrakt eller virtuell, men ikke begge samtidig. Det er imidlertid viktig å merke seg at en abstrakt metode i bunn og grunn er en virtuell (overstyrbar) metode, men den har ingen implementasjon i basisklassen.

index.cs

index.cs

copy
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
using System; using System.Collections.Generic; abstract class Shape { // Perimeter is the length of the 'outline' of a shape protected float perimeter; public float getPerimeter() { return perimeter; } public abstract float getArea(); protected abstract float calculatorPerimeter(); } class Rectangle : Shape { float width; float height; public Rectangle(float width, float height) { this.width = width; this.height = height; this.perimeter = getPerimeter(); } public override float getArea() { return width * height; } protected override float calculatorPerimeter() { return width * 2 + height * 2; } } class Square : Shape { float length; public Square(float length) { this.length = length * length; } public override float getArea() { return length * length; } protected override float calculatorPerimeter() { return 4 * length; } } class Circle : Shape { float radius; public Circle(float radius) { this.radius = radius; } public override float getArea() { return 3.14f * radius * radius; } protected override float calculatorPerimeter() { return 2.00f * 3.14f * radius; } } class ConsoleApp { static void Main() { Rectangle r1 = new Rectangle(10f, 20f); Square s1 = new Square(10f); Circle c1 = new Circle(10f); // We cannot create an instance of 'Shape' but we can use type datatype "Shape" for creating variables, arrays or lists List<Shape> shapes = new List<Shape>(); shapes.Add(r1); shapes.Add(s1); shapes.Add(c1); foreach(Shape shape in shapes) { Console.WriteLine(shape.getArea()); } } }

1. Hvilket nøkkelord brukes for å gjøre en klasse abstrakt?

2. Kan en abstrakt klasse instansieres?

question mark

Hvilket nøkkelord brukes for å gjøre en klasse abstrakt?

Select the correct answer

question mark

Kan en abstrakt klasse instansieres?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 5. Kapittel 8
some-alt