Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Abstraktio | OOP-Periaatteet
C# Perusteiden Jälkeen

bookAbstraktio

Abstraktio on olio-ohjelmoinnin (OOP) keskeinen käsite, jonka avulla voidaan piilottaa monimutkaiset toteutustiedot ja keskittyä olennaisiin toiminnallisuuksiin. C#:ssa abstraktio toteutetaan abstraktien luokkien avulla.

Note
Huomio

OOP perustui alun perin kolmeen periaatteeseen (joita kutsutaan joskus nimellä "OOP:n kolme peruspilaria"), jotka ovat kapselointi, perintä ja polymorfismi. Näin ollen abstraktio on uusi lisäys, eikä sitä aina pidetä perustavanlaatuisena käsitteenä joidenkin lähteiden mukaan, mutta se on silti tärkeä käsite.

Abstrakti luokka on luokka, jota ei voi olioistaa, eli et voi luoda kyseisestä luokasta oliota. Abstrakti luokka voi sisältää ominaisuuksia ja metodeja kuten mikä tahansa muu luokka, mutta se voi sisältää myös abstrakteja metodeja, jotka ovat mallimetodeja ja tarkoitettu johdettujen luokkien toteutettaviksi.

Voit luoda abstraktin luokan lisäämällä abstract-avainsanan luokan määrittelyn eteen. Esimerkiksi luodaan abstrakti luokka nimeltä 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 } }

Vastaavasti voit luoda abstraktin metodin lisäämällä avainsanan abstract palautustyypin eteen. Abstraktilla metodilla ei ole runkoa – se toimii ainoastaan mallipohjana:

index.cs

index.cs

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

Tämän tarkoituksena on luoda mallipohja muille luokille. Tämä auttaa yksinkertaistamaan koodia. Ymmärtääksemme tätä paremmin, tarkastellaan Polymorfismi-tehtävää luvusta 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()); } }

Yllä olevassa esimerkissä et koskaan aio käyttää Shape-luokkaa, mutta silti jouduit kirjoittamaan tekaistut toteutukset getArea- ja calculatePerimeter-metodeille Shape-luokan sisälle. Voit yksinkertaistaa tätä koodia tekemällä Shape-luokasta abstraktin, ja lisäksi voit tehdä myös getArea- ja calculatePerimeter-metodeista abstrakteja.

Note
Huomio

Metodi voi olla joko abstrakti tai virtuaalinen, mutta ei molempia samanaikaisesti. On kuitenkin tärkeää huomata, että abstrakti metodi on pohjimmiltaan virtuaalinen (ylikirjoitettava) metodi, mutta sillä ei ole runkoa kantaluokassa.

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; } 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. Mitä avainsanaa käytetään luokan tekemiseen abstraktiksi?

2. Voiko abstraktia luokkaa olioistaa?

question mark

Mitä avainsanaa käytetään luokan tekemiseen abstraktiksi?

Select the correct answer

question mark

Voiko abstraktia luokkaa olioistaa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 8

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 2.04

bookAbstraktio

Pyyhkäise näyttääksesi valikon

Abstraktio on olio-ohjelmoinnin (OOP) keskeinen käsite, jonka avulla voidaan piilottaa monimutkaiset toteutustiedot ja keskittyä olennaisiin toiminnallisuuksiin. C#:ssa abstraktio toteutetaan abstraktien luokkien avulla.

Note
Huomio

OOP perustui alun perin kolmeen periaatteeseen (joita kutsutaan joskus nimellä "OOP:n kolme peruspilaria"), jotka ovat kapselointi, perintä ja polymorfismi. Näin ollen abstraktio on uusi lisäys, eikä sitä aina pidetä perustavanlaatuisena käsitteenä joidenkin lähteiden mukaan, mutta se on silti tärkeä käsite.

Abstrakti luokka on luokka, jota ei voi olioistaa, eli et voi luoda kyseisestä luokasta oliota. Abstrakti luokka voi sisältää ominaisuuksia ja metodeja kuten mikä tahansa muu luokka, mutta se voi sisältää myös abstrakteja metodeja, jotka ovat mallimetodeja ja tarkoitettu johdettujen luokkien toteutettaviksi.

Voit luoda abstraktin luokan lisäämällä abstract-avainsanan luokan määrittelyn eteen. Esimerkiksi luodaan abstrakti luokka nimeltä 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 } }

Vastaavasti voit luoda abstraktin metodin lisäämällä avainsanan abstract palautustyypin eteen. Abstraktilla metodilla ei ole runkoa – se toimii ainoastaan mallipohjana:

index.cs

index.cs

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

Tämän tarkoituksena on luoda mallipohja muille luokille. Tämä auttaa yksinkertaistamaan koodia. Ymmärtääksemme tätä paremmin, tarkastellaan Polymorfismi-tehtävää luvusta 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()); } }

Yllä olevassa esimerkissä et koskaan aio käyttää Shape-luokkaa, mutta silti jouduit kirjoittamaan tekaistut toteutukset getArea- ja calculatePerimeter-metodeille Shape-luokan sisälle. Voit yksinkertaistaa tätä koodia tekemällä Shape-luokasta abstraktin, ja lisäksi voit tehdä myös getArea- ja calculatePerimeter-metodeista abstrakteja.

Note
Huomio

Metodi voi olla joko abstrakti tai virtuaalinen, mutta ei molempia samanaikaisesti. On kuitenkin tärkeää huomata, että abstrakti metodi on pohjimmiltaan virtuaalinen (ylikirjoitettava) metodi, mutta sillä ei ole runkoa kantaluokassa.

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; } 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. Mitä avainsanaa käytetään luokan tekemiseen abstraktiksi?

2. Voiko abstraktia luokkaa olioistaa?

question mark

Mitä avainsanaa käytetään luokan tekemiseen abstraktiksi?

Select the correct answer

question mark

Voiko abstraktia luokkaa olioistaa?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 5. Luku 8
some-alt